• 多叉树操作


    需求一、查询当前群的所有子级群组

    递归 遍历N叉树,获取数据

     /**
         * 获取子级群列表信息
         * @param roomId
         * @param inside
         * @return
         */
        @Override
        public TreeRoom getSubGroup(ObjectId roomId, int inside) {
            Room room = roomCoreDao.get(roomId);
            if(null == room){
                return null;
            }
            TreeRoom treeRoom = new TreeRoom(room.getId(),room.getLogo(),room.getJid(),room.getGroupId(),room.getName(),room.getType(),room.getInside(),room.getParentId(),null);
            return recursion(treeRoom,inside);
        }
        
        /**
         * 遍历多叉树节点(向下遍历)
         * @param treeRoom 根节点
         * @param inside -1不区分内外部群  0内部群 1外部群
         * @return
         */
        public TreeRoom recursion(TreeRoom treeRoom,int inside){
            List<TreeRoom> list = null;
            TreeRoom subRoom = null;
            List<Room> rooms = roomCoreDao.getRoomByParentId(treeRoom.getId());
            if (null != rooms && rooms.size()>0){
                list = new ArrayList<>(rooms.size());
                for (int i = 0; i < rooms.size(); i++) {
    
                    if(rooms.get(i).getInside() == inside || inside == -1){
                        subRoom = new TreeRoom(rooms.get(i).getId(),rooms.get(i).getLogo(),rooms.get(i).getJid(),rooms.get(i).getGroupId(),rooms.get(i).getName(),rooms.get(i).getType(),rooms.get(i).getInside(),rooms.get(i).getParentId(),null);
                    }
                    if(null == subRoom){
                        break;
                    }
                    if(treeRoom.getSubRoom() == null){
                        list.add(subRoom);
                        treeRoom.setSubRoom(list);
                    }else {
                        treeRoom.getSubRoom().add(subRoom);
                    }
                    // 递归处理子级群
                    recursion(subRoom,inside);
                }
            }
            return treeRoom;
        }

    返回数据

    {
      "currentTime": 1637218489567,
      "data": {
        "groupId": "100000005371",
        "id": "618b747e55bae6217cca507b",
        "inside": 0,
        "jid": "e349b7bc809c46e1b8614687a04e5201",
        "name": "太极马包谷官方群",
        "subRoom": [
          {
            "groupId": "100000002330",
            "id": "618ce53889180154e0733bd0",
            "inside": 1,
            "jid": "c686735712924e47b09fd2f57262227c",
            "name": "马太极主群",
            "parentId": "618b747e55bae6217cca507b",
            "subRoom": [
              {
                "groupId": "100000005301",
                "id": "6195f86b06eccf39ceb04ad2",
                "inside": 1,
                "jid": "42a71b84483b422d9e641d254bfdec3d",
                "name": "马太极分群1",
                "parentId": "618ce53889180154e0733bd0",
                "type": 12
              },
              {
                "groupId": "100000007758",
                "id": "6195f8a806eccf39ceb04ad6",
                "inside": 1,
                "jid": "366fba389cac4370941fde3885d94ecf",
                "name": "马太极分群3",
                "parentId": "618ce53889180154e0733bd0",
                "type": 12
              }
            ],
            "type": 11
          },
          {
            "groupId": "100000005717",
            "id": "618cecb43c48063a72efde44",
            "inside": 0,
            "jid": "01e9ff3f159c4134a9327d536cf9611b",
            "name": "马太极主群2",
            "parentId": "618b747e55bae6217cca507b",
            "subRoom": [
              {
                "groupId": "100000006522",
                "id": "618ced113c48063a72efde49",
                "inside": 0,
                "jid": "9a13f53c573e4c418704052ca8c4e8aa",
                "name": "马太极分群2",
                "parentId": "618cecb43c48063a72efde44",
                "subRoom": [
                  {
                    "groupId": "100000006107",
                    "id": "618ced5b3c48063a72efde4e",
                    "inside": 0,
                    "jid": "5f3decd59f5446f5a7934fa36b957cbe",
                    "name": "马太极支群2",
                    "parentId": "618ced113c48063a72efde49",
                    "subRoom": [
                      {
                        "groupId": "100000009504",
                        "id": "618ced803c48063a72efde52",
                        "inside": 0,
                        "jid": "c7ef71e5912444839a9e783b827c6349",
                        "name": "马太极子群2",
                        "parentId": "618ced5b3c48063a72efde4e",
                        "type": 14
                      }
                    ],
                    "type": 13
                  }
                ],
                "type": 12
              }
            ],
            "type": 11
          }
        ],
        "type": 2
      },
      "resultCode": 1
    }

    需求二、模糊搜索展示群组信息,并附带它的父级群组信息

    先模糊查询群组信息,再向上遍历补全父级节点数据

     /**
         * 向上遍历补全父级数据
         * @param
         * @return
         */
        public List<TreeRoom> upTraversal(List<TreeRoom> treeRooms){
            TreeRoom parentRoom = null;
            Room parent = null;
            List<TreeRoom> list = null;
            if(null != treeRooms && treeRooms.size() > 0){
                for (int i = 0; i < treeRooms.size(); i++) {
                    if(treeRooms.get(i).getType() != 2){ //判断不是祖级
                        parent = roomCoreDao.getRoomById(treeRooms.get(i).getParentId());
                        parentRoom = new TreeRoom(parent.getId(),parent.getLogo(),parent.getJid(),parent.getGroupId(),parent.getName(),parent.getType(),parent.getInside(),parent.getParentId(),null);
                        list = new ArrayList<>(1);
                        list.add(new TreeRoom(treeRooms.get(i).getId(),treeRooms.get(i).getLogo(),treeRooms.get(i).getJid(),treeRooms.get(i).getGroupId(),treeRooms.get(i).getName(),treeRooms.get(i).getType(),treeRooms.get(i).getInside(),treeRooms.get(i).getParentId(),treeRooms.get(i).getSubRoom()));
                        parentRoom.setSubRoom(list);
                        treeRooms.remove(i);
                        treeRooms.add(i,parentRoom);
                        if(parent.getType() != 2){
                            upTraversal(treeRooms);
                        }
                    }
                }
            }
            return treeRooms;
        }

    对于同一个祖级节点下的同名群组,存在数据重复的问题,因此要去重

    {
          "groupId": "100000005371",
          "id": "618b747e55bae6217cca507b",
          "inside": 0,
          "jid": "e349b7bc809c46e1b8614687a04e5201",
          "name": "太极马包谷官方群",
          "type": 2
        },
        {
          "groupId": "100000005371",
          "id": "618b747e55bae6217cca507b",
          "inside": 0,
          "jid": "e349b7bc809c46e1b8614687a04e5201",
          "name": "太极马包谷官方群",
          "subRoom": [
            {
              "groupId": "100000002330",
              "id": "618ce53889180154e0733bd0",
              "inside": 1,
              "jid": "c686735712924e47b09fd2f57262227c",
              "name": "马太极主群",
              "parentId": "618b747e55bae6217cca507b",
              "type": 11
            }
          ],
          "type": 2
        },
        {
          "groupId": "100000005371",
          "id": "618b747e55bae6217cca507b",
          "inside": 0,
          "jid": "e349b7bc809c46e1b8614687a04e5201",
          "name": "太极马包谷官方群",
          "subRoom": [
            {
              "groupId": "100000005717",
              "id": "618cecb43c48063a72efde44",
              "inside": 0,
              "jid": "01e9ff3f159c4134a9327d536cf9611b",
              "name": "马太极主群2",
              "parentId": "618b747e55bae6217cca507b",
              "type": 11
            }
          ],
          "type": 2
        }

    可以看到,当搜索“太极”时,这三条数据其实都是一个祖级节点。需要合并成一条数据。

    就此打住,这个实现复杂不说,后台处理大量数据也影响性能。因此增加群层级的类,保存到数据库,直接查询比较简单快捷。

  • 相关阅读:
    WPF 命令基础
    委托 C#
    Volley网络请求框架的基本用法
    MailOtto 实现完美预加载以及源码解读
    Android_时间服务
    Android_Chronometer计时器
    Android_Json实例
    完结篇
    就快完结篇
    MySQL 选出日期时间最大的一条记录
  • 原文地址:https://www.cnblogs.com/zeussbook/p/15572437.html
Copyright © 2020-2023  润新知