为了账号安全,请及时绑定邮箱和手机立即绑定

需要根据父子关系将数据列表转换为列表列表

需要根据父子关系将数据列表转换为列表列表

当年话下 2023-04-13 15:20:34
我需要根据父子关系将数据列表转换为列表列表。如果 parent 为 null 落入一级,则二级将基于一级 id。我的数据如下所示:[    {id:1, parent: null },    {id:2, parent: 1 },    {id:3, parent: 1 },    {id:4, parent: 1 },    {id:5, parent: 2 },    {id:6, parent: 2 },    {id:7, parent: 3 },    {id:8, parent: 3 },    {id:9, parent: 4 },    {id:10, parent: 4 },    {id:11, parent: 5 },    {id:12, parent: null },    {id:13, parent: 12 },]我的代码是:响应数据Map<String,Map<String,ResponseData>> map = new HashMap<>();for (ResponseData responseData : responseDataList) {    Map<String,responseData> responseDatasMap =  map.get(responseData.getParent());    if(responseDatasMap != null) {        responseDatasMap.put(responseData.getId(),responseData);        map.put(responseData.getParent(),responseDatasMap);    } else {        responseDatasMap =  new HashMap<>();        responseDatasMap.put(responseData.getParent(),responseData);        map.put(responseData.getParent(),responseDatasMap);    }}上面的地图将包含父级作为键和映射到父级的值的地图List<List<ResponseData>> sections = new ArrayList<>();for (Map.Entry<String,Map<String, ResponseData>> responseDataMap : map.entrySet()) {    Map<String, ResponseData> valueMap = responseDataMap.getValue();    responseDataList = new ArrayList<>();    for(Map.Entry<String, ResponseData> responseData :valueMap.entrySet()) {        responseDataList.add(responseData.getValue());    }    sections.add(responseDataList);}我的输出如下所示:[    [ {id:1, parent: null } ],    [ {id:2, parent: 1 },{id:3, parent: 1 },{id:4, parent: 1 } ],    [ {id:5, parent: 2 },{id:6, parent: 2 } ],    [ {id:7, parent: 3 },{id:8, parent: 3 } ],    [ {id:9, parent: 4 },{id:10, parent: 4 } ],    [ {id:11, parent: 5 }]]请检查并让我知道我们如何实施。提前致谢
查看完整描述

1 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

为了表示树结构,我使用了ArrayList,其中节点的索引等于其在数组中的索引 + 1。如果您有稀疏树/某些索引可能丢失,请使用映射的等效方法。


使用 Java 8 流 API 的解决方案:


public static void main( String[] args ) {

        List<ResponseData> responseDataList = Arrays.asList(

            new ResponseData( 1, -1 ),  // changed null to -1 as null can't be a map key

            new ResponseData( 2, 1 ),

            new ResponseData( 3, 1 ),

            new ResponseData( 4, 1 ),

            new ResponseData( 5, 2 ),

            new ResponseData( 6, 2 ),

            new ResponseData( 7, 3 ),

            new ResponseData( 8, 3 ),

            new ResponseData( 9, 4 ),

            new ResponseData( 10, 4 ),

            new ResponseData( 11, 5 ),

            new ResponseData( 12, -1 ),

            new ResponseData( 13, 12 )

        );

        final Map<Integer, List<ResponseData>> map = responseDataList.stream()

                .collect( Collectors.groupingBy( o -> getLevel( responseDataList, o, 0 ) ) );

        System.out.println( map );

        // To convert the Map to a List of Lists:

        System.out.println( new ArrayList<>( map.values() ));

    }


    private static int getLevel(List<ResponseData> nodes, ResponseData responseData, int level) {

        if( responseData.parent == -1 ) {

            return level;

        } else {

            return getLevel( nodes, nodes.get( responseData.parent - 1 ), level + 1 );  // -1 to adjust index

        }

    }


    private static final class ResponseData {

        public int id;

        public int parent;


        public ResponseData( int id, int parent ) {

            this.id = id;

            this.parent = parent;

        }


        @Override

        public String toString() {

            return String.format( "{id: %d, parent: %d}", id, parent );

        }

    }

此外,此代码期望您的树确实是一棵树。如果有任何循环,它将无限循环,最终因堆栈溢出而失败。


查看完整回答
反对 回复 2023-04-13
  • 1 回答
  • 0 关注
  • 77 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信