【问题标题】:Convert two dimensional array to List in java?在java中将二维数组转换为List?
【发布时间】:2012-07-11 23:08:06
【问题描述】:

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

【问题讨论】:

  • 您是指 1 个列表,还是“2D”列表?
  • 您希望元素以哪种顺序出现,或者您想要一个列表列表?
  • 你想要数组列表还是列表列表?
  • @nhahtdh 我编辑了这个问题。

标签: java


【解决方案1】:

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

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

基本上,你会做三件事:

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

【讨论】:

  • 我想将 int [ ] [ ] 数组转换为 List>。我收到一个错误 - 必需类型:List> 提供:List>。我该如何解决这个问题?
  • 您无法转换数组类型 int。您必须具有整数类型的数组。将其流式传输到 List
  • 请检查我的解决方案
【解决方案2】:

在 Java 8 中,要将 int[][] 转换为 List&lt;Integer&gt;,您可以使用以下代码:

List<Integer> data = Arrays.stream(intervals)
              .flatMapToInt(Arrays::stream)
              .boxed()
              .collect(Collectors.toList());

【讨论】:

    【解决方案3】:

    例如

    Integer[][] a = { { 1, 2, 3 }, { 4, 5, 6 }, { 9, 8, 9 }, };
            
    List<List<Integer>> arr = Arrays.stream(a)
                    .map(Arrays::asList)
                    .collect(Collectors.toList());
    

    【讨论】:

      【解决方案4】:

      让我们添加一些原始类型数组处理。但是您可以将任何对象传递给参数。方法正确处理为 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
      }
      

      【讨论】:

        【解决方案5】:

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

        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]
        

        【讨论】:

          【解决方案6】:
          ArrayList<Elelement[]> allElelementList = new ArrayList<>(allElelements.length);
              allElelementList.addAll(Arrays.asList(allElelements));
          

          allElelements 是二维的

          【讨论】:

            【解决方案7】:

            使用 java8 "flatMap" 来玩。一种方法可能是关注

            List<Foo> collection = Arrays.stream(array).flatMap(Arrays::stream).collect(Collectors.toList());
            

            【讨论】:

            • 这与 Tomasz Mularczyk 的回答有何不同?
            【解决方案8】:

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

            【讨论】:

            • 我想将 int [ ] [ ] 数组转换为 List>。我收到一个错误 - 方法参考中的返回类型错误:无法将 java.util.stream.IntStream 转换为 java.util.stream.Stream>。我该如何解决这个问题?
            【解决方案9】:
            for(int i=0;i<m;i++)
                for(int j=0;j<n;j++)
                    yourList.add(foosArray[i][j]);
            

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

            【讨论】:

              【解决方案10】:

              请注意:在将数组转换为列表时,原始数组和对象数组之间存在差异。即)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 的回答;您必须使用 How to convert int[] to Integer[] in Java?

              将原始数组转换为对象数组

              否则,在正常的 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) 会给出fixed-size list; so size cannot be modified

              【讨论】:

                【解决方案11】:

                另一种技术。

                //converting 2D array to string
                String temp = Arrays.deepToString(fooArr).replaceAll("\\[", "").replaceAll("\\]", "");
                List<String> fooList = new ArrayList<>(Arrays.asList(","));
                

                【讨论】:

                  【解决方案12】:

                  这对于任何二维数组来说都是一种很好的方法,假设您希望它们按以下顺序排列:

                  [[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;
                  }
                  

                  【讨论】:

                    【解决方案13】:

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

                    ArrayList<Foo[]> list = new ArrayList<Foo[]>(foosArray.length);
                    for(Foo[] foo: foosArray){
                        list.add(foo);
                    }
                    

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2020-10-04
                      • 2011-07-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2012-12-09
                      • 1970-01-01
                      • 2019-01-23
                      • 1970-01-01
                      相关资源
                      最近更新 更多