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"}

... 等等。

请告知如何执行此操作,知道我可能有数百个类的列表作为输入。

谢谢

4

4 回答 4

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);
    }
}
于 2013-05-29T11:12:43.813 回答
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 而不是列表。

于 2013-05-29T13:27:58.550 回答
0

您可以在每个 String 上使用 split() 方法并在所有结果数组上循环:

for (String s: strings)
{
    for (String anotherS: s.split(".");
    {
        //assign to itam classes
    }
}
于 2013-05-29T10:58:57.763 回答
0

根据定义,Parent/Child结构将是某种Tree. 考虑以下...

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

Map<String, Item> rootMap;

使用split其他地方建议的方法,然后遍历包中的元素,向下钻取rootMap.

这是一个改进,List因为当您有共同的父包时,您必须通过搜索List来找到Item要添加新包的适当对象。

于 2013-05-29T11:12:56.407 回答