在java中将二维数组转换为List?

Inq*_*ive 22 java

我有一个m X nObject的二维数组说Foo.所以我有Foo[][] foosArray.将其转换为List<Foo>Java 的最佳方法是什么?

Kep*_*pil 33

这是为任何二维数组执行此操作的一种很好的方法,假设您按以下顺序需要它们:

[[array [0] -elems],[array [1] elems] ...]

public <T> List<T> twoDArrayToList(T[][] twoDArray) {
    List<T> list = new ArrayList<T>();
    for (T[] array : twoDArray) {
        list.addAll(Arrays.asList(array));
    }
    return list;
}
Run Code Online (Sandbox Code Playgroud)

  • 但是,如果我想将 2D 数组(```String[][] arr```)转换为 2D ArrayList,比如 ```ArrayList&lt;ArrayList&lt;T&gt;&gt; list; ````? (2认同)

Tom*_*zyk 14

List<Foo> collection = Arrays.stream(array)  //'array' is two-dimensional
    .flatMap(Arrays::stream)
    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

  • 我想将 int [ ] [ ] 数组转换为 List&lt;List&lt;Integer&gt;&gt;。我收到错误 - 方法引用中的返回类型错误:无法将 java.util.stream.IntStream 转换为 java.util.stream.Stream&lt;?&gt;。我该如何解决 ? (2认同)

Dmi*_*sev 9

for(int i=0;i<m;i++)
    for(int j=0;j<n;j++)
        yourList.add(foosArray[i][j]);
Run Code Online (Sandbox Code Playgroud)

我认为其他技巧是不必要的,因为无论如何,他们会使用这个解决方案.


nyb*_*bon 6

这可以通过这种方式使用Java 8流API完成:

String[][] dataSet = new String[][] {{...}, {...}, ...};
List<List<String> list = Arrays.stream(dataSet)
                               .map(Arrays::asList)
                               .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

基本上,你做三件事:

  • 将2-d数组转换为流
  • 使用Arrays :: asList API将流中的每个元素(应该是一个数组)映射到List中
  • 将流减少为新列表

  • 我想将 int [ ] [ ] 数组转换为 List&lt;List&lt;Integer&gt;&gt;。我收到错误 - 必需类型:List&lt;List&lt;Integer&gt;&gt; 提供:List&lt;List&lt;int[]&gt;&gt;。我该如何解决 ? (3认同)

Mas*_*oe2 5

这是将 int(即原始数据类型)的二维数组转换为列表的分步解决方案。解释在代码注释中。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Temp {
    public static void main(String... args) {
        System.out.println("Demo...");
        int [] [] twoDimArray = new int[][]{
                {1,2}, {3,5}, {8,15}
        };

        List< List<Integer> > nestedLists =
                Arrays.
                //Convert the 2d array into a stream.
                stream(twoDimArray).
                //Map each 1d array (internalArray) in 2d array to a List.
                map(
                        //Stream all the elements of each 1d array and put them into a list of Integer.
                        internalArray -> Arrays.stream(internalArray).boxed().collect(Collectors.toList()
                    )
        //Put all the lists from the previous step into one big list.
        ).collect(Collectors.toList());

        nestedLists.forEach(System.out::println);
        
    }
}
Run Code Online (Sandbox Code Playgroud)

输出 :

Demo...
[1, 2]
[3, 5]
[8, 15]
Run Code Online (Sandbox Code Playgroud)