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

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 に答える
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 に答える
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 に答える