树形结构数据封装

public class DemoApplicationTests {
    
    
   /**
    * @param args
    */
   public static void main(String[] args) {
    
    
       ArrayList<Node> nodes = new ArrayList<>();
       nodes.add(new Node(1, 0, "1"));
       nodes.add(new Node(2, 0, "2"));
       nodes.add(new Node(3, 0, "3"));

       nodes.add(new Node(4, 1, "1-1"));
       nodes.add(new Node(5, 4, "1-1-1"));
       nodes.add(new Node(6, 4, "1-1-2"));
       nodes.add(new Node(7, 6, "1-1-2-1"));

       nodes.add(new Node(8, 2, "2-1"));
       nodes.add(new Node(9, 2, "2-2"));

       nodes.add(new Node(10, 3, "3-1"));

       ArrayList<Node> nodeTree = new ArrayList<>();

       long start = System.currentTimeMillis();
       for (Node node1 : nodes) {
    
    
           if (node1.getPid() == 0) {
    
    
               nodeTree.add(node1);
           }
           for (Node node2 : nodes) {
    
    
               if (node1.getId().equals(node2.getPid())) {
    
    
                   node1.getChildren().add(node2);
               }
           }
       }

       System.out.println(JSON.toJSONString(nodeTree));
       System.out.println(System.currentTimeMillis()-start);

   }

   @Test
   public void testTree() {
    
    
       ArrayList<Node> nodes = new ArrayList<>();
       nodes.add(new Node(1, 0, "1"));
       nodes.add(new Node(2, 0, "2"));
       nodes.add(new Node(3, 0, "3"));

       nodes.add(new Node(4, 1, "1-1"));
       nodes.add(new Node(5, 4, "1-1-1"));
       nodes.add(new Node(6, 4, "1-1-2"));
       nodes.add(new Node(7, 6, "1-1-2-1"));

       nodes.add(new Node(8, 2, "2-1"));
       nodes.add(new Node(9, 2, "2-2"));

       nodes.add(new Node(10, 3, "3-1"));

       long start = System.currentTimeMillis();
       Map<Integer,Node> map= new HashMap<>();
       nodes.forEach(e->map.put(e.getId(),e));

       for (Node node1 : nodes) {
    
    
           Optional.ofNullable(map.get(node1.getPid())).ifPresent(p->{
    
    
               p.children.add(node1);
           });
       }

       List<Node> list = nodes.stream().filter(e -> Objects.equals(e.getPid(), 0)).collect(Collectors.toList());

       System.out.println(JSON.toJSONString(list));

       System.out.println(System.currentTimeMillis()-start);


   }
}


class Node {
    
    
   private Integer id;
   private Integer pid;
   private String name;
   List<Node> children = new ArrayList<>();
}
transformTozTreeFormat: function (sNodes) {
    
    
   var i, l;
   var r = [];
   var tmpMap = {
    
    };
   
   for (i = 0, l = sNodes.length; i < l; i++) {
    
    
     // 将sNodes的每个元素都放进map中,结构为:id -> sNode (注意没有s)
     tmpMap[sNodes[i].id] = sNodes[i];
   }
   
   for (i = 0, l = sNodes.length; i < l; i++) {
    
    
     // 从map中,取出当前节点sNode[i]的父节点
     var p = tmpMap[sNodes[i].pid];
     // 如果当前节点存在父节点(并且当前节点的id和pid不同),
     // 则将当前节点sNode[i]添加到父节点的children属性中(如果父节点的children属性还没有的话,就先给个空数组)
     if (p && sNodes[i].id != sNodes[i].pid) {
    
    
       var children = this.nodeChildren(p);
       if (!children) {
    
    
         children = this.nodeChildren(p, []);
       }
       children.push(sNodes[i]);
     } else {
    
    
      // 如果不存在父节点,则直接添加到结果集中
       r.push(sNodes[i]);
     }
   }
   // 所以循环了一遍之后,每一个节点如果能找到它的父节点,那么都会添加到父节点的children当中。
   //                  没有找到父节点的,都会添加到最后的结果集中。
   return r;
 }
nodeChildren: function (node, newChildren) {
    
    
   if (typeof newChildren !== 'undefined') {
    
    
     node.children = newChildren;
   }
   return node.children;
 }

猜你喜欢

转载自blog.csdn.net/qq_16992475/article/details/118344611