将 List<List<Integer>> 转换为 int[][]

Posted

技术标签:

【中文标题】将 List<List<Integer>> 转换为 int[][]【英文标题】:Converting List<List<Integer>> to 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 数组的方法,反之亦然,还有更多围绕列表、数组等的转换方法。我学到的东西远远超出了这个问题的范围.非常感谢为这个问题做出贡献的每个人。 【参考方案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;

以上是关于将 List<List<Integer>> 转换为 int[][]的主要内容,如果未能解决你的问题,请参考以下文章

将 Integer[] 添加到 list<Object>

如何为 List<List<List<Integer>>> nums = new ArrayList<List<List<Integer>&

map<Integer,List>转String[]怎样转?

List<Integer>list =new ArrayList<Integer>(); <Integer> 啥意思?

List<List<Integer>> ArrayList 初始化不适用于新运算符 Java

泛型 List<String> 和 List<Integer> 未按预期运行