当前位置: 首页 > 知识库问答 >
问题:

在java中展平嵌套的N层嵌套对象

濮君植
2023-03-14

我有一门java课

class Example{
   String field1;
   String field2;
   List<Example> subExamples;    
}

在上面的场景中,示例具有子示例,这又是示例列表。此嵌套可以是 n 级。我想实现的是有一个示例列表,即扁平化上面的对象并将所有示例收集到最终列表中(收集所有n级示例)。一个明显的方法是递归。在Java中有什么方法可以更有效地实现它。我尝试了一些java 8概念,但它们不符合要求。

共有3个答案

长孙瑞
2023-03-14

这可以以非递归方式完成:

private Collection<Example> flatten(Example example) {
  Queue<Example> work = new ArrayDeque<>();
  if (example != null) {
    work.offer(example);
  }
  Collection<Example> flattened = new ArrayList<>();
  while(!work.isEmpty()) {
    Example cur = work.poll();
    flattened.add(cur);
    cur.subExamples.forEach(work::offer);
  }
  return flattened;
}
姚洲
2023-03-14

您可以使用一个简单的方法:

static Stream<Example> flatten(Example ex) {
    if (ex.getSubExamples() == null || ex.getSubExamples().isEmpty()) {
        return Stream.of(ex);
    }

    return Stream.concat(Stream.of(ex), 
                ex.getSubExamples().stream().flatMap(Main::flatten));
}

你可以把它用作

List<Example> flattened = examples.stream()
        .flatMap(Main::flatten) //change class name
        .collect(Collectors.toList());
丌官子安
2023-03-14

例如:

private static Stream<Example> flat(Example example) {
    return Stream.concat(Stream.of(example),
                         example.getSubExamples().stream().flatMap(Sandbox::flat));
}

其中< code>Sandbox是定义< code>flat方法的类。

 类似资料:
  • 我花了一段时间才弄明白这一点,我想分享我的解决方案。当然欢迎改进。 参考:在RDD中展平Scala映射,通过反转groupby(即,为其中的每个序列重复标题)来展平序列 我有一个RDD的形式:RDD[(Int,List[(String,List[(String,Int,Float)])]] 关键字:Int 值:List[(String,List[(String,Int,Float)])] 目标是将

  • 问题内容: 我正在尝试将JSON转换为CSV文件,可用于进一步分析。我的结构存在的问题是,当我转换JSON文件时,我有很多嵌套的字典/列表。 我尝试使用pandas ,但它只会使第一级扁平化。 任何想法如何讨好整个JSON文件,以便我可以为单个(在本例中为虚拟机)条目创建到CSV文件的单行输入?我已经尝试过这里发布的几种解决方案,但是我的结果始终只是将第一级展平。 这是示例JSON(在这种情况下,

  • 问题内容: 我想拉平一个嵌套的JSON对象,如以为了消化它Solr中。 我有11 TB的json文件,这些文件既嵌套又包含字段名称中的点,这意味着elasticsearch(点)或solr(嵌套时不带符号)都不能按原样消化它。 其他解决方案是用下划线替换字段名称中的点并将其推送到elasticsearch,但是我对solr有更好的经验,因此我更喜欢扁平化解决方案(除非solr可以按原样消化那些嵌套

  • 问题内容: 给定一个,其中值是a 或另一个,那么如何使用Java 8将地图展平到单个值列表? 例: 对于上面的示例,我想要以下列表: 我知道可以这样做: 我该如何使用? 编辑: 经过一番游戏后,我发现了: 问题答案: 您可以定义一个递归方法来展平一个地图并将其用作函数或直接调用它来使用。 例: 对于给定的嵌套地图,它会打印 [value1,value2,value3.1,value3.2,valu

  • 问题内容: 要求是为将输入JSON对象输入到扁平化JSON对象创建通用的扁平化实用程序。 样本JSON如下所示 我一直试图将其展平到3个级别,并提出了以下实用程序。但是,当我不得不处理数组和String,long,Timestamp等类型的值时,事情变得越来越复杂。而且,我无法理解如何维护嵌套键的唯一性。 任何帮助是极大的赞赏。 问题答案: 为了避免与键名冲突,可以使用JSON指针规范创建它们。库

  • 问题内容: 如我们所知,通过使用方法将数组展平 那么如何将此数组展平到? 问题答案: 这是递归的一种替代方法,并且应接受任何深度级别,以避免堆栈溢出。