2017-08-08 111 views
-7

我有一個字符串的排序列表,我需要拆分並將其添加到樹或某種列表。舉例來說,如果我有這些字符串:拆分字符串並添加到數組列表

List<String> folders = new ArrayList<String>(); 
    folders.add("Buffet::soups::veg soup"); 
    folders.add("Buffet::soups::non veg soup"); 
    folders.add("Buffet::soups::non veg soup::chicken soup"); 
    folders.add("Vegetables"); 
    folders.add("Cheese"); 
    folders.add("Buffet::Starters"); 
    folders.add("Buffet::Sandwitch"); 
    folders.add("Buffet::Sandwitch::Cheese Sandwitch"); 
    folders.add("Buffet::soups::veg soup::tomato soup"); 

這樣我可以有一個列表或樹類別相關聯的類別和子類別。 任何幫助將不勝感激。

+1

爲什麼你只是不一起工作的定義,一個類模型代替字符串? –

+0

我需要拆分字符串,以便區分類別和子類別。 –

回答

1

使用一個類來定義一個類別/子類別和另一個來定義一個產品。 您的類別是一個包含類別列表和產品列表的對象。

public class Category { 

    private String name; 
    private List<Category> subCategories; 
    private List<Product> products; 

    // getter/setters 
} 

public class Product { 
    private String name; 
    // any other property defining your product 

    // getters/setters 
} 

這個你可以建立一棵樹。使用工廠;一個實用程序類,甚至是你的類別對象的生成器(但這是骯髒的)來構建你的樹。

然後通過你的字符串的實用工具類,將其添加到您的樹

public class ProductTreeBuilder { 

    public static Category addToTree(Category mainNode, String toAdd) { 
     if (mainNode == null) { 
      mainNode = new Category("BaseCategory"); 
     } 
     Category currentNode = mainNode; 
     String[] path = toAdd.split("::"); 
     for (int i = 0; i < path.length; i++) { 

      String nameCatOrProduct = path[i]; 
      // if end of path, it's a produc 
      // if it's not in product list, add it 
      if ((i == path.length - 1) && !currentNode.getProducts().contains(nameCatOrProduct)) { 
       currentNode.getProducts().add(new Product(nameCatOrProduct)); 
      } else { 
       // check if currentNode contains subCategory 
       Category subCategory = currentNode.getSubCategories().stream().filter(c -> c.getName().equals(
         nameCatOrProduct)).findFirst().orElse(null); 
       if (subCategory == null) { 
        // subCategory doesn't exist yet, create it 
        subCategory = new Category(nameCatOrProduct); 
        currentNode.getSubCategories().add(subCategory); 
       } 
       // continue with the subCaegory 
       currentNode = subCategory; 
      } 
     } 

     return mainNode; 

    } 
} 

,那麼你可以簡單地使用你的工廠來構建你的樹:

Category tree = null; 
    tree = ProductTreeBuilder.addToTree(tree, "cat1::cat2::test"); 
    tree = ProductTreeBuilder.addToTree(tree, "cat2::test"); 
1

定義類別

class Category 
{ 
    private String name = ""; 
    private List<Category> children = new ArrayList<>(); 
    private Category parent = null; 
    public Category(String name) 
    { 
     this.name = name; 
    } 
    public void addChild(Category child) 
    { 
     child.parent = this; 
     children.add(child); 
    } 
    public Collection<Category> children() 
    { 
     return new HashSet<>(children); 
    } 
    public Category parent() 
    { 
     return parent; 
    } 
    public String toString(){return name;} 
    public String entireHierarchyToString() 
    { 
     return entireHierarchyToString(0); 
    } 
    private String entireHierarchyToString(int d) 
    { 
     String tmp = ""; 
     for(int i=0;i<d;i++) 
      tmp += "\t"; 
     tmp += name; 
     for(Category c : children) 
      tmp += "\n" + c.entireHierarchyToString(d+1); 
     return tmp; 
    } 
} 

然後我們使用遞歸方法爲我們構建樹:

private void process(String[] path, int p, Category root) 
{ 
    if(p >= path.length) 
     return; 
    String tmp = path[p]; 
    Category next = null; 
    for(Category c : root.children()) { 
     if (c.toString().equals(tmp)) { 
      next = c; 
      break; 
     } 
    } 
    if(next == null) { 
     next = new Category(tmp); 
     root.addChild(next); 
    } 
    process(path, p+1, next); 
} 

在我們的主要方法,那麼我們可以使用下面的邏輯:

List<String> folders = new ArrayList<String>(); 
folders.add("Buffet:soups:veg soup"); 
folders.add("Buffet:soups:non veg soup"); 
folders.add("Buffet:soups:non veg soup:chicken soup"); 
folders.add("Vegetables"); 
folders.add("Cheese"); 
folders.add("Buffet:Starters"); 
folders.add("Buffet:Sandwitch"); 
folders.add("Buffet:Sandwitch:Cheese Sandwitch"); 
folders.add("Buffet:soups:veg soup:tomato soup"); 

Category root = new Category("[ROOT]"); 
for(String s : folders) 
{ 
     process(s.split(":"), 0, root); 
} 
System.out.println(root.entireHierarchyToString()); 

這應該打印出來:

 
[ROOT] 
    Buffet 
     soups 
      veg soup 
       tomato soup 
      non veg soup 
       chicken soup 
     Starters 
     Sandwitch 
      Cheese Sandwitch 
    Vegetables 
    Cheese