java - 如何将列表连接成一个列表
问题描述
我有一个值列表,其中一些可能是列表/集合或单个值。在 JavaScript 表示法中,它可能看起来像:
const input = [1,2,[3,4], [5,6], 7];
我想得到:
const concatenated = [1,2,3,4,5,6,7];
所以我有这个Java代码:
ArrayList<T> concatenated = new ArrayList<>();
for (T v : input) {
try{
concatenated.addAll((Collection) v);
}
catch (Exception e1){
try{
concatenated.addAll((List) v);
}
catch (Exception e2){
concatenated.add(v);
}
}
}
但该代码对我来说似乎很糟糕。首先,我不知道尝试转换为 List 或 Collection 是否足够 - 我应该尝试转换为其他类型吗?有什么我不应该忽略的错误吗?
如何正确地做到这一点?
解决方案
Exception
除非列表中有null
值,否则代码不需要这样处理。尽管在您的情况下,只需将基础转换instanceOf
为:
// Edit: Since the type of the input `Collection` is not bound strictly
List<Object> flatten(Collection<?> input) {
List<Object> concatenated = new ArrayList<>();
for (Object v : input) {
if (v instanceof Collection) {
concatenated.addAll(flatten((Collection<?>) v));
} else {
concatenated.add(v);
}
}
return concatenated;
}
在 jshell 上进一步使用它会给我这个输出:
jshell> List<Object> list = List.of(1,2,List.of(3,4),List.of(5,6),7)
list ==> [1, 2, [3, 4], [5, 6], 7]
jshell> flatten(list)
$3 ==> [1, 2, 3, 4, 5, 6, 7]
:
推荐阅读
- angularjs - Angularjs 指令 element.on('change') 没有触发
- r - 是否可以循环多个对象并调用循环中每个对象内的元素
- python - 如何从主题建模中制作主题百分比条形图?
- ruby - Rubocop 方法名称长度是否可配置?
- python - 如何让 Python 代码中的 REST API 会话保持活跃?
- c - Getopt 尝试使用时未找到“*”标志
- c++ - 由于缺少const而出现编译错误?
- macos - AppleScript 文档中的 r/o 是什么?
- azure - 更改 Azure Web 应用程序中的目标框架
- r - 以编程方式调整多个 Plotly (R) 子图的布局