将 List<List<Integer>> 转换为 int[][]
Posted
技术标签:
【中文标题】将 List<List<Integer>> 转换为 int[][]【英文标题】:Converting List<List<Integer>> to int[][] 【发布时间】:2016-12-26 02:15:25 【问题描述】:我正在编写一个方法,它将 Integer
数据类型从 List
的 List
s 转换为原始数组数组,类型为 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<java.lang.Integer> cannot be converted to int
。
【问题讨论】:
这:Array<Array<int>>
毫无意义。编译器不允许草率的错误,你也不应该。提问时请力求准确。
应该是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 有类似的问题,例如当List
是LinkedList
时,它就不能很好地工作。 Iterator
是更好的选择。【参考方案3】:
Java 7。将List<List<Integer>>
转换为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<List<Integer>>
以上是关于将 List<List<Integer>> 转换为 int[][]的主要内容,如果未能解决你的问题,请参考以下文章
如何为 List<List<List<Integer>>> nums = new ArrayList<List<List<Integer>&
map<Integer,List>转String[]怎样转?
List<Integer>list =new ArrayList<Integer>(); <Integer> 啥意思?