列表的列表的列表(用 N 深度展平 ArrayList)
我正在尝试用 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));
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这似乎对我有用,使用递归。当给定一个列表时,
然后
打印
There is a bit of Uncheckedcasting正在进行,但不知道如何做没有
This seems to work for me, using recursion. When given a list
then
prints
There is a bit of Unchecked casting going on, but not sure how to do without
对于
List
,>>> listB
.stream().flatMap(.stream()).flatMap(.stream()).flatMap(.stream()).collect()
但是对于
列表<列表<列表<整数>>> listA
,.stream().flatMap(.stream()).flatMap(.stream()).collect()
。请参阅 flatMap() 计数仅比通用深度少 1。
For
List<List<List<List<Integer>>>> listB
,.stream().flatMap(.stream()).flatMap(.stream()).flatMap(.stream()).collect()
But for
List<List<List<Integer>>> listA
,.stream().flatMap(.stream()).flatMap(.stream()).collect()
.See flatMap() count is just one less than the Generic depth.
我希望您知道深度嵌套的集合并不是表示数据的最佳方式,必须避免(它几乎肯定是错误设计的指标)。因此,我将把这个问题视为一个神秘的谜题,而不是一个实际任务。
您可以在不使用递归的情况下实现这一点。但请注意,这种方法和递归一样都是恶性的,因为递归方法也需要放弃泛型提供的类型安全(我警告过你不应该'首先不要这样做)。
为此,您需要在循环中执行
instanceof
检查。并使用嵌套列表的元素填充行类型的结果列表。注意:
List
,其特征为协变(即您可以仅分配相同类型的集合给它)您可以将任何东西分配给< em>行类型 和修改它。这是一个不安全的组合,因此强烈建议不要使用行类型集合。如果第一个元素不是列表,则循环退出。
输出
I hope you know that deeply nested collections isn't the best way to represent the data and must be avoided (it's an almost certain indicator of faulty design). So I'll treat this question as a cryptic puzzle rather than a practical task.
You can achieve that without using recursion. But caution this approach is vicious as well recursion because as well recursive approach it requires to relinquish the type safety provided by generics (I've warned that you shouldn't do that in the first place).
To do that, you need to perform
intanceof
checks in a loop. And populate the resulting list of row type with elements of a nested list.Note :
List<Integer>
which characterized as covariant (i.e. you can assign only collection of the same type to it) you're allowed and to assign anything to the list of row type and to modify it as well. Which is an unsafe combination, and hence usage of row type collections is highly discouraged.The loop exits if the first element isn't a list.
Output
下面的代码片段对我有用。感谢大家的回复。
列表 list1 = Arrays.asList(4,5,6);
列表 list2 = Arrays.asList(7,8,9);
The below snippet worked for me. Thanks for the response all.
List list1 = Arrays.asList(4,5,6);
List list2 = Arrays.asList(7,8,9);