пераўтварыць спіс імёнаў пакетаў/класаў у бацькоўскай/дзецях структуру дадзеных

У мяне ёсць спіс імёнаў класаў, як наступныя:

   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 subItems;

}

метад будзе лічыць масіў вышэй і вырабляе наступны аб'ект.

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

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

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

... і гэтак далей.

Просьба паведаміць пра тое, як выканаць гэтую аперацыю, ведаючы, што я мог бы мець спіс сотняў класаў у якасці ўваходных дадзеных.

дзякуй

0
Гэта магло б быць лепш, калі ваш падпункты быў List , то вы можаце выкарыстоўваць рэкурсіўныя метады для дадання і пошуку
дададзена аўтар nitegazer2003, крыніца
Дзякуй, рэдагаваў пытанне, я меў на ўвазе, каб гэта List
дададзена аўтар Sammy, крыніца
Дзякуй, рэдагаваў пытанне, я меў на ўвазе, каб гэта List
дададзена аўтар Sammy, крыніца

8 адказы

Калі ласка, глядзіце маю рэалізацыю на C# для Java вы можаце выкарыстоўваць яго ў якасці псевдокода.

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

    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 замест спісу.

1
дададзена

Калі ласка, глядзіце маю рэалізацыю на C# для Java вы можаце выкарыстоўваць яго ў якасці псевдокода.

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

    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 замест спісу.

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);
    }
}
1
дададзена
+1 за добрае рэкурсіўнай рашэннем. Я хацеў бы прапанаваць выкарыстанне Карта , каб паскорыць пошук.
дададзена аўтар John B, крыніца

Вось код/​​псевдокод, які можа дапамагчы вам з рэкурсіўнай метадам:

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);
    }
}
1
дададзена
+1 за добрае рэкурсіўнай рашэннем. Я хацеў бы прапанаваць выкарыстанне Карта , каб паскорыць пошук.
дададзена аўтар John B, крыніца

Вы можаце выкарыстоўваць метад Спліту() на кожную радок і пятлю на ўсе выніковыя масівах:

for (String s: strings)
{
    for (String anotherS: s.split(".");
    {
        //assign to itam classes
    }
}
0
дададзена

Вы можаце выкарыстоўваць метад Спліту() на кожную радок і пятлю на ўсе выніковыя масівах:

for (String s: strings)
{
    for (String anotherS: s.split(".");
    {
        //assign to itam classes
    }
}
0
дададзена

Па вызначэнні Parent/Child структура будзе нейкая Дрэва . Разгледзім наступнае ...

public class Item  {
   private String itemName;
   private Map subItems;
}

Map rootMap;

Выкарыстоўвайце Падзяліць метад, прапанаваны ў іншым месцы, то цыкл праз элементы ў пакеце бурэння ўніз адпаведных галін rootMap .

Гэта паляпшэнне ў параўнанні з List , як калі ў вас ёсць агульныя бацькоўскія пакеты, якія вы павінны былі б зрабіць пошук праз List , каб знайсці падыходны Кропка у які дадаць новы пакет.

0
дададзена

Па вызначэнні Parent/Child структура будзе нейкая Дрэва . Разгледзім наступнае ...

public class Item  {
   private String itemName;
   private Map subItems;
}

Map rootMap;

Выкарыстоўвайце Падзяліць метад, прапанаваны ў іншым месцы, то цыкл праз элементы ў пакеце бурэння ўніз адпаведных галін rootMap .

Гэта паляпшэнне ў параўнанні з List , як калі ў вас ёсць агульныя бацькоўскія пакеты, якія вы павінны былі б зрабіць пошук праз List , каб знайсці падыходны Кропка у які дадаць новы пакет.

0
дададзена