当前位置: 首页 > 面试题库 >

如何将嵌套的Java集合中的所有项目展平为单个List?

江鹏飞
2023-03-14
问题内容

给定对象的复杂嵌套集合,例如:

Set<List<Map<String, List<Object>>>> complexNestedCollection;

是否存在通用方法来对此进行平坦化并获取其中包含List的所有Objects中的一个?

一些细节:

  1. 该列表不应包含集合对象本身或映射键-仅包含最低级别的值。
  2. 它应尽可能遵循相同的顺序-因此在示例中,列表中的各项将是顺序的,而地图/集合的顺序将取决于实现。
  3. 它可以选择排除重复项
  4. 更新: 理想情况下,它应该在任何级别上检测/处理循环引用,例如List<List<Object>>,外部List包含其自身作为成员。(感谢AdrianJałoszewski在下面的评论中提及此内容)。

注意:实际用例是从中获取所有StringList<List<String>>,这可以通过两个循环轻松完成,但是这让我对一般情况感到疑惑。


问题答案:

假设您使用 Java 8 ,那么可以Stream API通过以下方法flatMap(Function<? super T,? extends Stream<? extends R>> mapper)来实现:

// 1. Convert the Set as a Stream of List<Map<String, List<Object>>>
// 2. Extract the elements of the lists to get a Stream of Map<String, List<Object>>
// 3. Extract values of the maps to get a Stream of List<Object>
// 4. Extract the elements of the lists to get a Stream of Object
// 5. Get rid of duplicates
// 6. Collect the result as a List of Object
List<Object> result = complexNestedCollection.stream()
    .flatMap(List::stream)
    .flatMap(m -> m.values().stream())
    .flatMap(List::stream)
    .distinct()
    .collect(Collectors.toList());

<R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper)

返回一个流,该流包括将流中的每个元素替换为通过将提供的映射函数应用于每个元素而生成的映射流的内容而得到的结果。将每个映射流的内容放入该流后,将其关闭。(如果映射的流为null,则使用空流。)

对于 以前的版本
Java,你仍然可以使用FluentIterable
谷歌番石榴 更换Stream和使用transformAndConcat(Function<? super E,? extends Iterable<? extends T>> function),而不是flatMap扁平化您的收藏。

然后,先前的代码段将被重写为下一个:

List<Object> result =
    new ArrayList<>(
        new LinkedHashSet<>(
            FluentIterable.from(complexNestedCollection)
                .transformAndConcat(
                    new Function<List<Map<String, List<Object>>>, Iterable<Map<String, List<Object>>>> () {
                        public Iterable<Map<String, List<Object>>> apply(final List<Map<String, List<Object>>> input) {
                            return input;
                        }
                    }
                ).transformAndConcat(
                    new Function<Map<String, List<Object>>, Iterable<List<Object>>> () {
                        public Iterable<List<Object>> apply(final Map<String, List<Object>> input) {
                            return input.values();
                        }
                    }
                ).transformAndConcat(
                    new Function<List<Object>, Iterable<Object>> () {
                        public Iterable<Object> apply(final List<Object> input) {
                            return input;
                        }
                    }
                ).toList()
        )
    );


 类似资料:
  • 给定对象的复杂嵌套集合,如: 是否存在一个泛型方法来将其平坦化并获得包含在其中的所有的单个? null

  • 问题内容: 我在Scala和Java之间遇到编译问题。 我的Java代码需要一个 我的scala代码有一个 我收到编译错误: 似乎scala.collection.JavaConversions不适用于嵌套集合,即使Vector可以隐式转换为Iterable。除了遍历scala集合并手动进行转换之外,我还能做些什么使这些类型起作用? 问题答案: 应该弃用恕我直言。您最好使用来明确说明转换的时间和地

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

  • < code>[[{header=C,value=dsd},{header=D,value=test},{header=E,value=e},{header=F,value=hhh},{header=G,value=ghgh}]] 上面是JsonLists数组的数组,我需要将外部数组扁平化为JsonLists的内部数组。 我最终也只会从JsonList中获取值,并将这些值放入它自己的单独数组中:

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

  • 问题内容: 我想 展平 Java中某种类型T的元素的 任意深度嵌套的集合/结构 ,最好是 仅具有实时视图,没有复制的收藏集; 不仅处理集合,还处理迭代器,任意维的T数组,可迭代,以及所有这些结构的任意混合和嵌套; 静态类型安全。 是否有可以处理此问题的Java库? 番石榴似乎只处理一个嵌套级别,即--flatten-> 。 lambdaj看起来很有希望:我可以以某种方式结合起来,并实现这一目标吗?