【发布时间】:2011-07-01 01:21:05
【问题描述】:
假设我有一个ArrayList<ArrayList<E>> 形式的数组列表...将其转换为二维数组的最优雅的方法是什么
【问题讨论】:
标签: java arrays multidimensional-array arraylist
假设我有一个ArrayList<ArrayList<E>> 形式的数组列表...将其转换为二维数组的最优雅的方法是什么
【问题讨论】:
标签: java arrays multidimensional-array arraylist
这假设您没有任何空值或任何类似的棘手问题。 这也不能保证数组的一致性(即“矩形”)
final int listSize = list.size();
E[][] darr = new E[listSize][];
for(int i = 0; i < listSize; i++) {
ArrayList<E> sublist = list.get(i);
final int sublistSize = sublist.size();
darr[i] = new E[sublistSize];
for(int j = 0; j < sublistSize; j++) {
darr[i][j] = sublist.get(j);
}
}
【讨论】:
size 值缓存在final 变量中,您的代码将更高效(并且IMO 更具可读性)。
如果E是一个泛型类,我们的问题是没有反射就无法创建泛型数组,而使用反射我们需要类对象(或示例数组对象)。
我不确定这是否“优雅”,但让我们试试吧:
导入 java.lang.reflect.Array;
<E> public static E[][] toArray(List<List<E>> list, Class<E> elementType) {
E[] sample = (E[])Array.newInstance(elementType, 0);
List<E[]> tempList = new ArrayList<E[]>(list.size());
for(List<E> subList : list) {
tempList.add( subList.toArray(sample));
}
E[][] finalSample = (E[][])Array.newInstance(sample.getClass(), 0)
return tempList.toArray(finalSample);
}
这可能需要一些 @SuppressWarning("unchecked") 用于 Array.newInstance 的强制转换。
【讨论】: