2009-08-07 65 views
1

我有一个有向图,用于包含循环的Java中所有可用的地址格式。除了上面的模板之外,我还想存储作为此图形范围的用户地址。我的图是从下面的XML获得:如何创建生成树

<address> 
    <city start="true"> 
     <minicity /> 
     <street /> 
     <square /> 
    </city> 
    <minicity> 
     <street /> 
     <alley /> 
     <square /> 
    </minicity> 
    <street> 
     <street /> 
     <alley /> 
     <blibd /> 
    </street> 
    <square> 
     <street /> 
     <alley /> 
     <blibd /> 
    </square> 
    <alley final="true"> 
     <alley /> 
     <blibd /> 
     <plaque /> 
    </alley> 
    <blibd final="true"> 
     <alley /> 
     <blibd /> 
     <plaque /> 
    </blibd> 
    <plaque final="true"> 
     <stage /> 
     <unit /> 
    </plaque> 
    <stage final="true"> 
     <unit /> 
    </stage> 
    <unit final="true"> 
    </unit> 
</address> 

正如你可以看到图的大街节点具有高于本身就是一个周期。用户地址的样本应该是这样的:

城市:街道:乙街道:C街道:d胡同:F

我的问题是: 什么是存储的最佳方式用户的地址图?我有上面的模板图,并想知道将用户图保存在此模板中还是外部使用不同的结构会更好。

回答

1

adjacency matrix是表示图形的标准方式。在你的情况下,矩阵的每个元素都可以用节点类别(城市等)来补充。

用户的地址可以通过存储对给定地址的最内层节点的单独引用并向外追溯到城市级别来构建地址来获得。

虽然我个人可能会选择比通用图更加结构化的方法,创建诸如城市,街道等业务对象,从而强制实施地址结构;例如

public interface Residence { 
    int getNumber(); 
    Street getStreet(); 
} 

public interface Street { 
    City getCity(); 
} 

public interface City { 
    Country getAddress(); 
} 

要显示给定居住地址,我只需走对象图;例如

Residence r = ... 
System.err.println(String.format("%d %s %s %s", r.getNumber(), r.getStreet(), r.getStreet().getCity(), r.getStreet().getCity().getCountry())); 
+0

我图的每个节点都是一个类,它有一些用于设置它的子节点的函数 – JGC 2009-08-07 14:38:41

+0

您是否必须以这种通用的方式对它进行建模?为什么不把它转化为更有意义的业务对象来强制某种结构? – Adamski 2009-08-07 14:39:57

+0

因为我不想让用户输入每种地址组合,并且因为我想制作可重用的代码,所以我制作了AddressNode类,并使用地址节点类制作树结构 – JGC 2009-08-07 16:35:34