32

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

4

14 回答 14

40

这是对任何二维数组执行此操作的好方法,假设您希望它们按以下顺序排列:

[[数组[0]-elems],[数组[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;
}
于 2012-07-12T08:37:18.140 回答
21

由于

List<Foo> collection = Arrays.stream(array)  //'array' is two-dimensional
    .flatMap(Arrays::stream)
    .collect(Collectors.toList());
于 2016-05-28T11:32:46.460 回答
14
for(int i=0;i<m;i++)
    for(int j=0;j<n;j++)
        yourList.add(foosArray[i][j]);

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

于 2012-07-12T08:27:00.413 回答
13

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

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

基本上,你做三件事:

  • 将二维数组转换为流
  • 使用 Arrays::asList API 将流中的每个元素(应该是一个数组)映射到一个列表中
  • 将流减少到一个新的列表中
于 2016-07-27T06:50:50.860 回答
4

这是将 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);
        
    }
}

输出 :

Demo...
[1, 2]
[3, 5]
[8, 15]
于 2020-07-18T21:15:24.940 回答
3

将其转换为列表的唯一方法是遍历数组并随时构建列表,如下所示:

ArrayList<Foo[]> list = new ArrayList<Foo[]>(foosArray.length);
for(Foo[] foo: foosArray){
    list.add(foo);
}
于 2012-07-12T08:29:20.453 回答
3

使用java8“flatMap”来玩。一种方法可能是遵循

List<Foo> collection = Arrays.stream(array).flatMap(Arrays::stream).collect(Collectors.toList());
于 2018-04-26T17:16:48.077 回答
1

请注意:在将数组转换为列表时,原始数组和对象数组之间存在差异。即) int[] 和 Integer[]

例如)

int [][] twoDArray = {     
        {1,  2,  3,  4,  40},
        {5,  6,  7,  8,  50},
        {9,  10, 11, 12, 60},
        {13, 14, 15, 16, 70},
        {17, 18, 19, 20, 80},
        {21, 22, 23, 24, 90},
        {25, 26, 27, 28, 100},
        {29, 30, 31, 32, 110},
        {33, 34, 35, 36, 120}};

List list = new ArrayList();
for (int[] array : twoDArray) {
    //This will add int[] object into the list, and not the int values.
    list.add(Arrays.asList(array));
}

Integer[][] twoDArray = {     
        {1,  2,  3,  4,  40},
        {5,  6,  7,  8,  50},
        {9,  10, 11, 12, 60},
        {13, 14, 15, 16, 70},
        {17, 18, 19, 20, 80},
        {21, 22, 23, 24, 90},
        {25, 26, 27, 28, 100},
        {29, 30, 31, 32, 110},
        {33, 34, 35, 36, 120}};

List list = new ArrayList();
for (Integer[] array : twoDArray) {
    //This will add int values into the new list 
    // and that list will added to the main list
    list.add(Arrays.asList(array));      
}

致力于 Keppil 的回答;您必须使用如何在 Java 中将 int[] 转换为 Integer[] 将原始数组转换为对象数组?

否则在正常的 for 循环中一一添加 int 值。

int iLength = twoDArray.length;
List<List<Integer>> listOfLists = new ArrayList<>(iLength);
for (int i = 0; i < iLength; ++i) {
    int jLength = twoDArray[0].length;
    listOfLists.add(new ArrayList(jLength));
    for (int j = 0; j < jLength; ++j) {
      listOfLists.get(i).add(twoDArray[i][j]);
    }
}

另请注意, Arrays.asList(array) 将给出固定大小的列表;所以尺寸不能修改

于 2016-01-21T06:48:39.397 回答
1

例如

Integer[][] a = { { 1, 2, 3 }, { 4, 5, 6 }, { 9, 8, 9 }, };
        
List<List<Integer>> arr = Arrays.stream(a)
                .map(Arrays::asList)
                .collect(Collectors.toList());
于 2021-05-29T14:00:24.757 回答
0

另一种技术。

//converting 2D array to string
String temp = Arrays.deepToString(fooArr).replaceAll("\\[", "").replaceAll("\\]", "");
List<String> fooList = new ArrayList<>(Arrays.asList(","));
于 2015-07-31T19:05:58.680 回答
0
ArrayList<Elelement[]> allElelementList = new ArrayList<>(allElelements.length);
    allElelementList.addAll(Arrays.asList(allElelements));

allElelements 是二维的

于 2018-06-20T10:57:10.623 回答
0

让我们添加一些原始类型数组处理。但是您可以将任何对象传递给参数。方法正确处理为 int[][] as Object[][]:

 public <T, E> List<E> twoDArrayToList(T twoDArray) {

   if (twoDArray instanceof int[][])
     return Arrays.stream((int[][])twoDArray)
                  .flatMapToInt(a->Arrays.stream(a))
                  .mapToObj(i->(E)Integer.valueOf(i))
                  .collect(Collectors.toList());

   //… processing arrays of other primitive types 

   if (twoDArray instanceof Object[][])
        return Arrays.stream((E[][])twoDArray)
               .flatMap(Arrays::stream)
               .collect(Collectors.toList());

   return null; // better to throw appropriate exception 
                // if parameter is not two dimensional array
}
于 2021-02-07T09:27:48.723 回答
0

在 Java 8 中,要从int[][]to转换List<Integer>,您可以使用以下代码:

List<Integer> data = Arrays.stream(intervals)
              .flatMapToInt(Arrays::stream)
              .boxed()
              .collect(Collectors.toList());
于 2021-09-29T16:48:43.287 回答
0
List<Foo> list =  Arrays.stream(fooArray)
      .flatMap(e -> Stream :: of).collect(Collectors.toList());
于 2022-02-17T14:05:08.547 回答