2013-05-29 63 views
0

我有如下的類名稱的列表:轉換包/班的名單到父/兒童的數據結構

String s1 = "com.mycompany.project.dao.hibernate.BaseDAOHibernate"; 
    String s2 = "com.mycompany.project.domain.Product"; 
    String s3 = "com.mycompany.project.domain.ProductCategory"; 
    String s4 = "com.mycompany.project.service.impl.ProductServiceImpl"; 
    String s5 = "com.mycompany.project.domain.User"; 
    String s6 = "com.mycompany.project.service.impl.ProductCategoryServiceImpl"; 
    String s7 = "com.mycompany.project.dao.hibernate.ProductCategoryDAOHibernate"; 
    String s8 = "com.mycompany.project.dao.hibernate.ProductDAOHibernate"; 

    String[] strings = { s1, s2, s3, s4, s5, s6, s7, s8}; 

我想用下面的類此數組轉換成一個樹狀結構定義:

public class Item { 
    private String itemName; 
    private List<Item> subItems; 

} 

該方法將採用上面的數組併產生以下對象。

item.ItemName = "com"; 
item.suItems = {"mycompany"}; 

item2.itemName = "mycompany"; 
item2.subItems = {"project"); 

item3.itemName = {"project"}; 
item3.subItems = {"dao", "domain", "service"} 

...等等。

請知道如何執行此操作,知道我可能有數百個類的列表作爲輸入。

感謝

+1

它可能會更好,如果你的子項目是一個'名單',那麼你可以使用遞歸的方法來添加和搜索 – nitegazer2003

+0

謝謝,編輯的問題,我的意思是有其表 Sammy

回答

1

請參閱我在C#上的實現,對於Java您可以將其用作僞代碼。

public class Item 
{ 
    private String itemName; 
    private List<Item> subItems = new List<Item>(); 

    public void Push(string[] namespaces, int index) 
    { 
     if (index >= namespaces.Length) 
      return; 

     foreach (Item child in subItems) 
     { 
      if (child.itemName == namespaces[index]) 
      { 
       child.Push(namespaces, index + 1); 
       return; 
      } 
     } 

     Item newChild = new Item(); 
     newChild.itemName = namespaces[index]; 
     newChild.Push(namespaces, index + 1); 
     subItems.Add(newChild); 
    } 
} 

private static void Namespaces() 
{ 
    String s1 = "com.mycompany.project.dao.hibernate.BaseDAOHibernate"; 
    String s2 = "com.mycompany.project.domain.Product"; 
    String s3 = "com.mycompany.project.domain.ProductCategory"; 
    String s4 = "com.mycompany.project.service.impl.ProductServiceImpl"; 
    String s5 = "com.mycompany.project.domain.User"; 
    String s6 = "com.mycompany.project.service.impl.ProductCategoryServiceImpl"; 
    String s7 = "com.mycompany.project.dao.hibernate.ProductCategoryDAOHibernate"; 
    String s8 = "com.mycompany.project.dao.hibernate.ProductDAOHibernate"; 

    String[] strings = { s1, s2, s3, s4, s5, s6, s7, s8 }; 

    Item root = new Item(); 
    foreach (string s in strings) 
    { 
     root.Push(s.Split('.'), 0); 
    } 
    // Do something with root variable. 
} 

我也推薦使用HashMap代替列表。

0

您可以使用split()方法在每個String和環上的所有結果數組:

for (String s: strings) 
{ 
    for (String anotherS: s.split("."); 
    { 
     //assign to itam classes 
    } 
} 
1

下面是一些代碼/僞代碼,可以幫助你與你的遞歸方法:

public void add(Item node, String name) 
{ 
    String prefix = the part of the name before the first '.' 
    String suffix = the part of the name after the first '.' 
    if (there is no suffix) 
    { 
     subItems.add(new Node(prefix)); 
    } 
    else 
    { 
     Item subItem = null; 
     if (subItems contains an Item whose itemName is prefix) 
     { 
      subItem = that item 
     } 
     else 
     { 
      subItem = new Node(prefix); 
      subItems.add(subItem); 
     } 
     add(subItem, suffix); 
    } 
} 
+0

+1一個不錯的遞歸解決方案。我會建議使用'Map'來加速搜索。 –

0

按照定義a Parent/Child結構將是某種Tree。考慮以下...

public class Item { 
    private String itemName; 
    private Map<String, Item> subItems; 
} 

Map<String, Item> rootMap; 

使用split方法通過包中向下鑽取的rootMap適當分支元素別處建議,然後循環。

這是在List的改善,當你有,你就必須做通過List搜索,找到合適的Item成添加新的封裝公共父包的。