【问题标题】:Split string and add to array list拆分字符串并添加到数组列表
【发布时间】:2018-01-15 21:33:22
【问题描述】:

我有一个排序的字符串列表,我需要将其拆分并添加到树或某种列表中。例如,如果我有这些字符串:

    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");

这样我就可以在列表或树中拥有一个类别和与该类别关联的子类别。 任何帮助将不胜感激。

【问题讨论】:

  • 为什么你不为此定义一个类模型而不是使用字符串?
  • 我需要拆分字符串,以便区分类别和子类别。

标签: java android string list tree


【解决方案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);
}

在我们的 main 方法中,我们可以使用以下逻辑:

 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());

这应该打印出来:

[根] 自助餐 汤 蔬菜汤 蕃茄汤 非蔬菜汤 鸡汤 开胃菜 三明治 奶酪三明治 蔬菜 起司

【讨论】:

    【解决方案2】:

    使用一个类来定义一个类别/子类别,另一个来定义一个产品。 您的类别是一个包含类别列表和产品列表的对象。

    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
    }
    

    有了这个,你可以建立一棵树。使用工厂;一个实用程序类,甚至是您的类别对象的构建器(但这很脏)来构建您的树。

    然后将您的字符串传递给 Utility 类以将其添加到您的树中

    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");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多