首页 > 解决方案 > 如何将列表连接成一个列表

问题描述

我有一个值列表,其中一些可能是列表/集合或单个值。在 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 是否足够 - 我应该尝试转换为其他类型吗?有什么我不应该忽略的错误吗?

如何正确地做到这一点?

标签: javaarraylistconcatenation

解决方案


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]


推荐阅读