java - List of Lists 的列表(用 N 深度展平 ArrayList)

标签 java java-stream flatmap

我正在尝试用 N 深度展平 ArrayList。为此,我尝试使用 Stream API 的 flapMap 方法。我能得到它。但是我必须根据列表列表的数量重复使用 flatMap() 方法。如果我再使用一种 flatMap() 方法,它会显示编译时错误。有什么办法可以动态完成吗。

这是我使用的代码:

List<Integer> list1 = Arrays.asList(4,5,6);
List<Integer> list2 = Arrays.asList(7,8,9);

List<List<Integer>> listOfLists = Arrays.asList(list1, list2);

List<List<List<Integer>>> listA = Arrays.asList(listOfLists);
List<List<List<List<Integer>>>> listB = Arrays.asList(listA);

List<Integer> listFinal = listB.stream()
    .flatMap(x -> x.stream())
    .flatMap(x -> x.stream())
    .flatMap(x -> x.stream())
    .collect(Collectors.toList());
//In the above line, If I use listA instead of listB, it is showing error.

listFinal.forEach(x-> System.out.println(x));

最佳答案

这似乎对我有用,使用递归。当给出一个列表时

  • 检查它是否是一个整数列表,如果是则返回它。
  • 否则它是一个列表列表。 FlatMap 它(删除 1 层嵌套),并展平结果列表。
private static List<Integer> flatten(List<?> list) {
    if (list.get(0) instanceof Integer) {
        return (List<Integer>) list;
    }

    List<List<?>> listOfLists = (List<List<?>>) list;
    return flatten(listOfLists.stream()
            .flatMap(Collection::stream)
            .collect(Collectors.toList()));
}

然后

public static void main(String[] args) {
    List<List<List<List<List<Integer>>>>> listC = Arrays.asList(
            Arrays.asList(
                    Arrays.asList(
                            Arrays.asList(
                                    Arrays.asList(0, 1),
                                    Arrays.asList(2, 3, 4)
                            ),
                            Arrays.asList(
                                    Arrays.asList(5),
                                    Arrays.asList(6, 7),
                                    Arrays.asList(8, 9)
                            )
                    ),
                    Arrays.asList(
                            Arrays.asList(
                                    Arrays.asList(10, 11),
                                    Arrays.asList(12, 13, 14)
                            ),
                            Arrays.asList(
                                    Arrays.asList(15),
                                    Arrays.asList(16, 17),
                                    Arrays.asList(18, 19)
                            )
                    )
            ),
            Arrays.asList(
                    Arrays.asList(
                            Arrays.asList(
                                    Arrays.asList(20, 21),
                                    Arrays.asList(22, 23, 24)
                            ),
                            Arrays.asList(
                                    Arrays.asList(25),
                                    Arrays.asList(26, 27),
                                    Arrays.asList(28, 29)
                            )
                    ),
                    Arrays.asList(
                            Arrays.asList(
                                    Arrays.asList(30, 31),
                                    Arrays.asList(32, 33, 34)
                            ),
                            Arrays.asList(
                                    Arrays.asList(35),
                                    Arrays.asList(36, 37),
                                    Arrays.asList(38, 39)
                            )
                    )
            )
    );

    List<Integer> result = flatten(listC);

    System.out.println(listC);
    System.out.println(result);

}

打印

[[[[[0, 1], [2, 3, 4]], [[5], [6, 7], [8, 9]]], [[[10, 11], [12, 13, 14]], [[15], [16, 17], [18, 19]]]], [[[[20, 21], [22, 23, 24]], [[25], [26, 27], [28, 29]]], [[[30, 31], [32, 33, 34]], [[35], [36, 37], [38, 39]]]]]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39]

有一些未经检查的转换正在进行,但不确定如何做

关于java - List of Lists 的列表(用 N 深度展平 ArrayList),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71590068/

相关文章:

Java:递归泛型编译器错误

java - Spring Data JPA 和 Projection 为 TupleConverter 获取 ConverterNotFoundException

Java 抽象类(this 关键字)

java - 如何使用 java 8 流对对象进行排序

haskell - Clojure 中的 mapcat 和 Haskell 中的 concatmap 有什么区别?

scala - 平面图 scala [String, String,List[String]]

java - Java 的平台无关/dev/null 输出接收器

用于设置和保存顺序的 Java 流映射列表

java - 为什么 Stream::flatMap 的这种用法是错误的?

java - 使用 java8 stream api 时类型丢失