-3

说,我有一个 2 列的表

父母 - 孩子
135 - 140
140 - 141
141 - 142
141 - 145
135 - 149
149 - 150

顶部的父亲(“135”)是父列中的第一个值。

可以将数据放入列表中。

        List<String[]> myList=new ArrayList<String[]>();
        String[] s1={"135","140"};
        String[] s2={"140","141"};
        String[] s3={"141","142"};
        String[] s4={"141","145"};
        String[] s5={"135","149"};
        String[] s6={"149","150"};
        myList.add(s1);
        myList.add(s2);
        myList.add(s3);
        myList.add(s4);
        myList.add(s5);
        myList.add(s6);

将上述数据转换成这样的树的最少 Java 代码(可能使用非常优雅的算法)是多少:

+ 135
   + 140
      + 141
         + 142
         + 145
   + 149
      + 150

注意:我发现的其他一些解决方案是在 DB 中创建一个额外的表,但我不希望这样。DB中只有上表1个。我只想要一个纯算法将其转换为树。

4

1 回答 1

2

要创建一个简单的树,最好使用自定义类来表示节点的概念,并根据大小有两个子节点或一组子节点。

但是,如果您甚至不想使用结构,只需使用 HashMap

HashMap<Integer, List<Integer>> tree = new HashMap<Integer, List<Integer>>();

for (String line: input){
    String ints = line.split(" - ");
    Integer k = Integer.valueOf(ints[0]);
    Integer v = Integer.valueOf(ints[1]);
    List<Integer> children = tree.get(k);
    if (children == null){
        children = new ArrayList<Integer>();
        tree.put(k,children);
    }
    children.add(v);

    printIt(135, 0, tree);
}

 public static void printIt(Integer node, Integer depth, HashMap<Integer, List<Integer>> tree){
    System.out.println(getSpaces(depth) +"+ "+node);
    if (tree.containsKey(node)){
        for (Integer n : tree.get(node)){
            printIt(n, depth+1, tree);
        }
    }
}
public static String getSpaces(int depth){
    StringBuilder sb = new StringBuilder();
    for (int i=0;i<depth;i++){
        sb.append("  ");
    }
    return sb.toString();
}
于 2013-05-15T02:23:29.003 回答