如果您尝试以下通用实用程序函数会怎样:
public static <T> T[][] asMatrix(
Collection<? extends Collection<? extends T>> source,
T[][] target) {
// Create a zero-sized array which we may need when converting a row.
@SuppressWarnings("unchecked") T[] emptyRow =
(T[])Array.newInstance(target.getClass().getComponentType().getComponentType(), 0);
List<T[]> rows = new ArrayList<T[]>(source.size());
int i = 0;
for (Collection<? extends T> row : source) {
T[] targetRow = i < target.length ? target[i] : null;
rows.add(row.toArray(targetRow != null ? targetRow : emptyRow));
i += 1;
}
return rows.toArray(target);
}
用法:
Collection<List<Foo>> permuted = ...;
Foo[][] result = asMatrix(permuted, new Foo[][] {});
它的工作方式是访问每个子集合(即行),将其转换为数组。我们将这些数组缓存在一个集合中。然后我们要求该集合将自己转换为一个数组,我们将其用作函数的结果。
这个效用函数的好处是:
- 它
Collection.toArray
用于所有的数组构造和复制。
- 该函数是通用的,因此可以处理任何类型的引用类型(不幸的是,像 , 等原生类型
int
需要long
更多的工作)。
- 您传入目标数组,它甚至可能被预先分配到一定的大小,其行为与所做的完全相同
Collection.toArray
。
- 该函数可以容忍同时改变其大小的集合(只要集合本身是可以容忍的)。
- 转换是类型安全且类型严格的。
更多示例:
List<List<Integer>> list =
Arrays.asList(Arrays.asList(1, 2), Arrays.asList(3, 4));
Integer[][] result;
result = asMatrix(list, new Integer[][] {});
System.out.println(Arrays.deepToString(result));
result = asMatrix(list, new Integer[][] {new Integer[] {9, 9, 9, 9}, null});
System.out.println(Arrays.deepToString(result));
结果:
[[1, 2], [3, 4]]
[[1, 2, null, 9], [3, 4]]