从收集

时间:2016-09-29 06:38:25

标签: java arraylist data-structures collections

我是收藏品的新手。 我有以下课程

class ParantCategory {
    int id;
    String name;
    int pid;
    public ParantCategory(int id, String name, int pid) {
        this.id = id;
        this.name = name;
        this.pid = pid;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getPid() {
        return pid;
    }
    public void setPid(int pid) {
        this.pid = pid;
    }
}

我的主要方法类是

public class HierachiDemo {
    static ArrayList<ParantCategory> al = new ArrayList<>();
    public static void main(String[] args) {
        al.add(new ParantCategory(1, "000", 0));
        al.add(new ParantCategory(2, "A1", 1));
        al.add(new ParantCategory(3, "B1", 1));
        al.add(new ParantCategory(4, "A11", 2));
        al.add(new ParantCategory(5, "A12", 2));
        al.add(new ParantCategory(6, "A13", 2));
        al.add(new ParantCategory(7, "B11", 3));
        al.add(new ParantCategory(8, "B12", 3));
        al.add(new ParantCategory(9, "B13", 3));
        al.add(new ParantCategory(10, "A111", 4));
        al.add(new ParantCategory(11, "A112", 4));
        al.add(new ParantCategory(12, "A113", 4));
        HierachiDemo h = new HierachiDemo();
        //function call here
    }
}

我在arraylist中存储了元素。 现在我的问题是我需要递归函数,因为我将传递Name,它会给我所有来自n个级别的孩子。 例如: 如果我将A1作为名字传递,那么它应该给我所有的孩子,比如A11,A12,A13,以及是否还应该显示A11,A12,A13的子项。 我需要最终结果为A11,A12,A13,A111,A112,A113。

2 个答案:

答案 0 :(得分:3)

轻松蛮力&#34;解决方案是:

List<ParantCategory> matches = new ArrayList<>();
for (ParantCatagory parant : al) {
  if (parant.getName().startsWith("A1")) {
    matches.add(al);
  }
}

您也可以使用简单的过滤器来使用Java8流。

当然,这适用于这种简单的字符串比较。 必须澄清的关键是什么这样的&#34;孩子&#34;关系实际上意味着给你。在您的示例中,您只需告诉我们您考虑&#34; A112&#34;成为&#34; A1&#34;

孩子

因此,要解决您的评论:如果您要实施真正的层次排序,那么您必须在代码中表达。含义:您可能需要创建自己的实现;在您添加对象的位置,以及您编写的代码的基础上,您的树命令元素在这样的&#34;子类&#34;类别。

换句话说:您当前的代码对字符串做出简单的假设。如果你需要更复杂的东西;那么,必须实现这一点。你必须采取的第一步:自己澄清如何定义这种关系。这是我们无法帮助的事情!

换句话说:现在,您只拥有该Parant类的对象。这些对象之间的关系绝对没有。如果你想要这样的关系,你必须为你的班级添加手段来表达它们!例如,将您的班级更改为&#34; Node&#34;类;和Node ...有添加/查询节点的方法!

答案 1 :(得分:1)

如果你想坚持当前的结构。您可以创建一个满足您需求的方法。有两件事,

weblogic.security.spi.WLSUser

}

我们可以为孩子们制作递归方法。

List<ParantCategory> getChildNodes(String name, int levels){
    List<ParantCategory> results = new ArrayList<>();
    ParantCategory head = null;

    //assuming there is only one ParantCategory with the supplied name.
    for(ParantCategory p: al){
        if(name.equals(al.getName())){
            head = al;
            break;
        }
    }

   //if we cannot find the name just use an empty list.
   if(head==null) return results;
   results.add(head);
   results.addAll(getChildren(head.getPid(), levels));
   return results;