【问题标题】:Convert nested list to 2d array将嵌套列表转换为二维数组
【发布时间】:2014-12-30 19:47:54
【问题描述】:

我正在尝试将嵌套列表转换为二维数组。

List<List<String>> list = new ArrayList<>();

list.add(Arrays.asList("a", "b", "c"));
list.add(Arrays.asList("dd"));
list.add(Arrays.asList("eee", "fff"));

我想把它设为String[][]。我尝试了以下方法:

String[][] array = (String[][]) list.toArray();      // ClassCastException

String[][] array = list.toArray(new String[3][3]);   // ArrayStoreException

String[][] array = (String[][]) list.stream()        // ClassCastException
    .map(sublist -> (String[]) sublist.toArray()).toArray();

有没有可行的方法?请注意,直到运行时我才知道列表的大小,它可能是锯齿状的。

【问题讨论】:

  • 您还没有尝试使用两个嵌套的for 循环手动执行此操作?

标签: java multidimensional-array nested-lists


【解决方案1】:

没有简单的内置方法可以做您想做的事情,因为您的 list.toArray() 只能返回存储在列表中的元素数组,在您的情况下也可以是列表。

最简单的解决方案是创建二维数组并用每个嵌套列表中的 toArray 结果填充它。

String[][] array = new String[list.size()][];

int i = 0;
for (List<String> nestedList : list) {
    array[i++] = nestedList.toArray(new String[nestedList.size()]);
}

(如果您使用 Java 8 和 Alex did 这样的流,则可以缩短此代码)

【讨论】:

    【解决方案2】:

    你可以这样做:

    String[][] array = list.stream()
        .map(l -> l.stream().toArray(String[]::new))
        .toArray(String[][]::new);
    

    它从您的列表列表中创建一个Stream&lt;List&lt;String&gt;&gt;,然后使用map 将每个列表替换为一个字符串数组,结果为Stream&lt;String[]&gt;,最后调用toArray(带有生成器函数,而不是无参数版本)来生成String[][]

    【讨论】:

    • 像“double[][]”这样的原始类型怎么样?
    • @fuat list.stream() .map(l -&gt; l.stream().mapToDouble(Double::doubleValue).toArray()) .toArray(double[][]::new) 如果列表是List&lt;List&lt;Double&gt;&gt;。但是,如果任何 Doubles 为 null,它将抛出 NullPointerException。
    • 我使用这个.stream().map(p -&gt; new double[] {p.get(0), p.get(1)}).toArray(double[][]::new),但您的解决方案看起来更好。谢谢
    【解决方案3】:

    这是将二维列表转换为二维数组的最佳和最有效的方法;

    List<List<Integer>>  list2d = new ArrayList<>();
    Integer[][] array2d;
    
    array2d = list2d.stream().map(x->x.toArray(new Integer[x.size()])).toArray(Integer[][]::new);
    

    【讨论】:

      猜你喜欢
      • 2015-12-22
      • 2022-01-09
      • 2016-09-28
      • 2010-12-27
      • 2022-06-17
      • 2016-10-01
      • 2022-01-15
      • 2012-11-24
      • 2011-12-04
      相关资源
      最近更新 更多