解决方案 »

  1.   

    你的id为什么会有重复的呢?a2和a3、a22和a33的id是重复的,partid应该是该节点的父节点吧?如果是这样的话貌似不好判断
      

  2.   

    我按照自己的理解写了一个方法,是在主id不重复的情况下适用的,你可以试试,希望对你有帮助//首先是Childs类,可以自动忽略
    public class Childs {
    private Integer id;
    private String name;
    private Integer partid;
    public Integer getId() {
    return id;
    }
    public void setId(Integer id) {
    this.id = id;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public Integer getPartid() {
    return partid;
    }
    public void setPartid(Integer partid) {
    this.partid = partid;
    }
    public Childs(Integer id, String name, Integer partid) {
    super();
    this.id = id;
    this.name = name;
    this.partid = partid;
    }
    public Childs() {
    super();
    // TODO Auto-generated constructor stub
    }


    }import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Scanner;import javax.swing.text.AsyncBoxView.ChildState;
    public class TestDemo { public static void main(String[] args) {
    // TODO Auto-generated method stub
    List<Childs> list = getList();
    Map<Integer, List<Childs>> map = new HashMap<Integer,List<Childs>>();
    //支持输入任意id可获得相应的结果(此处没有进行验证,请自觉输入1-9中的任意一位数)
    System.out.print("请输入要查询的id:");
    Scanner sc = new Scanner(System.in);
    int index = sc.nextInt();

    map.put(index, getMap(index, list, new ArrayList()));
    //将结果输出
    System.out.println("id\tname\tpartid");
    for(int i = 0;i<map.get(index).size();i++){
    Childs c = map.get(index).get(i);
    System.out.println(c.getId()+"\t"+c.getName()+"\t"+c.getPartid());
    }
    }

    /**
     * 手动设工程一个符合条件的list
     * @return
     */
    public static List<Childs> getList(){
    List<Childs> list = new ArrayList<>();
    for(int i = 0;i<4;i++){
    int id = i+1;
    String name = "a";
    String a = "";
    for(int j = 0;j<i;j++){
    a += "1";
    }
    name += a;
    Integer partid;
    if(i==0)
    partid = null;
    else
    partid = i;
    Childs c = new Childs(id,name,partid);
    list.add(c);
    }
    Childs s1 = new Childs(5,"a2",1);
    Childs s2 = new Childs(6,"a22",5);
    Childs s3 = new Childs(7,"a3",1);
    Childs s4 = new Childs(8,"a33",7);
    Childs s5 = new Childs(9,"a333",8);
    list.add(s1);
    list.add(s2);
    list.add(s3);
    list.add(s4);
    list.add(s5);
    // System.out.println("id\tname\tpartid");
    // for(int i=0;i<list.size();i++){
    // Childs c = list.get(i);
    // System.out.println(c.getId()+"\t"+c.getName()+"\t"+c.getPartid());
    // }
    return list;
    }

    /**
     * 传入相应的参数来求得该id下的所有最小级别节点
     * @param id 要查询的节点id
     * @param list 已知的所有节点集合
     * @param result 要返回的所有最小级别节点集合
     * @return 返回result
     */
    public static List<Childs> getMap(Integer id,List<Childs> list,List<Childs> result){
    boolean flag = true;
    for(Childs c : list){
    if(c.getPartid()==id){
    flag = false;
    getMap(c.getId(),list,result);
    }
    }
    if(flag){
    for(Childs c : list){
    if(c.getId()==id)
    result.add(c);
    }
    }
    return result;
    }
    }