【问题标题】:Converting List<List<Integer>> to int[][]将 List<List<Integer>> 转换为 int[][]
【发布时间】:2016-12-26 02:15:25
【问题描述】:

我正在编写一个方法,它将 Integer 数据类型从 ListLists 转换为原始数组数组,类型为 int[][]

问题

有没有办法使用 Java API 将 Integer 转换为 int

供您参考,int[] set 将用于其他用途,请忽略。

我发现了什么

Apache Commons API "toPrimitive" 方法将 Integer 转换为 int 类型。但是,我只是在寻找使用本机 java API 的解决方案。

这是我目前的代码

class Test {
    int[][] convert(int[] set) {
        List<List<Integer>> ll = new ArrayList<List<Integer>>();
        ll.add(new ArrayList<Integer>());
        ll.add(new ArrayList<Integer>());
        ll.add(new ArrayList<Integer>());
        ll.get(0).add(1);
        ll.get(0).add(2);
        ll.get(1).add(2);
        ll.get(2).add(3);

        System.out.println(ll + " " + ll.size());

        int[][] tempArray = new int[0][0];
        for (int i = 0; i < ll.size(); i++) {
            for (int j = 0; j < ll.get(i).size(); j++) {
                tempArray[i][j] = ll.get(j);
            }
        }
        return tempArray;
    }
}

预期结果

List entry: [[1,2],[2],[3]]
return: {{1,2},{2},{3}}

错误

tempArray[i][j] = ll.get(j);

返回java.util.List&lt;java.lang.Integer&gt; cannot be converted to int

【问题讨论】:

  • 这:Array&lt;Array&lt;int&gt;&gt; 毫无意义。编译器不允许草率的错误,你也不应该。提问时请力求准确。
  • 应该是int类型数组的Array吗?如果是这样,为了清楚起见,我将更改问题主题。谢谢
  • 标题可以只写int[][]。每个人都知道这意味着什么。
  • 自动拆箱...
  • 我现在可以编写将 2D 列表转换为 1D/2D 数组的方法,反之亦然,还有更多围绕列表、数组等的转换方法。我学到的东西远远超出了这个问题的范围.非常感谢为这个问题做出贡献的每个人。

标签: java arrays multidimensional-array integer


【解决方案1】:

要回答您的确切问题,可以使用intValue() 方法将Integer 转换为int,或者您可以使用自动装箱转换为int

所以你的循环的最里面的部分可能是这些中的任何一个:

tempArray[i][j] = ll.get(i).get(j).intValue();
tempArray[i][j] = ll.get(i).get(j);

但是,我们也可以采取不同的策略。

作为 this answer 对类似问题的修改,在 Java 8 中,您可以使用 Streams 映射到整数数组。这种结构只需要一个额外的映射层。

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

int[][] arr = list.stream()
    .map(l -> l.stream().mapToInt(Integer::intValue).toArray())
    .toArray(int[][]::new);

Ideone Demo

【讨论】:

    【解决方案2】:

    这个

    tempArray[i][j] = ll.get(j);
    

    应该是这样的

    tempArray[i][j] = ll.get(i).get(j);
    

    但是,您还有一些其他错误(您需要声明数组);您还可以缩短初始化程序。类似的,

    static int[][] convert(int[] set) {
        List<List<Integer>> ll = new ArrayList<>();
        ll.add(Arrays.asList(1,2));
        ll.add(Arrays.asList(2));
        ll.add(Arrays.asList(2,3));
    
        System.out.println(ll + " " + ll.size());
    
        int[][] tempArray = new int[ll.size()][];
        for (int i = 0; i < ll.size(); i++) {
            tempArray[i] = new int[ll.get(i).size()];
            for (int j = 0; j < tempArray[i].length; j++) {
                tempArray[i][j] = ll.get(i).get(j);
            }
        }
        return tempArray;
    }
    

    【讨论】:

    • 这与this answer 有类似的问题,例如当ListLinkedList 时,它就不能很好地工作。 Iterator 是更好的选择。
    【解决方案3】:

    Java 7。将List&lt;List&lt;Integer&gt;&gt; 转换为int[][]

    // original list
    List<List<Integer>> list = Arrays.asList(
            Arrays.asList(1, 2),
            Arrays.asList(2),
            Arrays.asList(3));
    // initialize the array,
    // specify only the number of rows
    int[][] arr = new int[list.size()][];
    // iterate through the array rows
    for (int i = 0; i < arr.length; i++) {
        // initialize the row of the array,
        // specify the number of elements
        arr[i] = new int[list.get(i).size()];
        // iterate through the elements of the row
        for (int j = 0; j < arr[i].length; j++) {
            // populate the array
            arr[i][j] = list.get(i).get(j);
        }
    }
    // output
    System.out.println(Arrays.deepToString(arr));
    // [[1, 2], [2], [3]]
    

    【讨论】:

      【解决方案4】:

      请阅读代码中的 cmets 以便更好地理解!

      public void someFn() {
          List<List<Integer>> outerList = new ArrayList<>();
      
          /* Outer list index is array row index[i] and inner list index is 
             array column index[j].  This is how we are going to parse and 
             add the data into our array */
      
          List<Integer> innerList = new ArrayList<>();
          innerList.add(1);  // ---> Index (0, 0) After adding inner list to outer list
          innerList.add(2);  // ---> Index (0, 1)
          innerList.add(3);  // ---> Index (0, 2)
          innerList.add(4);  // ---> Index (0, 3)
      
          List<Integer> innerList1 = new ArrayList<>();
          innerList1.add(5);  // ---> Index (1, 0)
          innerList1.add(6);  // ---> Index (1, 1)
          innerList1.add(7);  // ---> Index (1, 2)
          innerList1.add(8);  // ---> Index (1, 3)
      
          outerList.add(innerList);
          outerList.add(innerList1);
      
          parseArrayFromList(outerList);
      }
      
      /* Outer list gives the number of rows size and the inner list 
         gives the number of columns size */
      private static void parseArrayFromList(List<List<Integer>> list) {
          int arr[][] = new int[list.size()][list.get(0).size()];
          
          for (int i = 0; i < list.size(); i++) {
              for (int j = 0; j < list.get(i).size(); j++) {
                  arr[i][j] = list.get(i).get(j);
              }
          }
      }
      

      【讨论】:

        【解决方案5】:

        我认为您不需要 API 即可将 Integer 转换为 int。只是因为 Integer 本身有自己的方法。让我们看看下面的例子

        Integer integerObj = new Integer(100);
        int intValue = integerObj.intValue();     // intValue = 100
        

        【讨论】:

        • 编译器会自动装箱,所以int intValue = integerObj; 也可以工作。但它不能一次拆箱整个List
        • 从 java 5 开始,它会自动装箱,但我认为依赖类似的东西是不好的做法。
        • 这是语言的一个特点。我从来没有听说过这是一种不好的做法,只是一种风格选择。
        • 好吧,当您使用不太方便的语言时,它会成为一个好习惯。
        • 我同意。无论如何,您需要描述这是如何回答问题的。这只是展示了如何拆箱单个Integer。问题是关于List&lt;List&lt;Integer&gt;&gt;
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-06
        • 1970-01-01
        • 2021-07-16
        • 2022-09-30
        • 2012-05-29
        相关资源
        最近更新 更多