【发布时间】:2011-09-08 03:30:36
【问题描述】:
如何静态初始化多维列表?
这行得通:
List<List<Integer>> list = new ArrayList<List<Integer>>();
但我想用一些静态列表来初始化列表,例如:(1,2,3)、(4,5,6) 和 (7,8,9)
【问题讨论】:
标签: java list initialization arraylist multidimensional-array
如何静态初始化多维列表?
这行得通:
List<List<Integer>> list = new ArrayList<List<Integer>>();
但我想用一些静态列表来初始化列表,例如:(1,2,3)、(4,5,6) 和 (7,8,9)
【问题讨论】:
标签: java list initialization arraylist multidimensional-array
如果您创建一个辅助方法,代码看起来会更好一些。例如
public class Collections {
public static <T> List<T> asList(T ... items) {
List<T> list = new ArrayList<T>();
for (T item : items) {
list.add(item);
}
return list;
}
}
然后你可以做(使用静态导入)
List<List<Integer>> list = asList(
asList(1,2,3),
asList(4,5,6),
asList(7,8,9),
);
为什么我不使用 Arrays.asList()
Arrays.asList() 返回一个 java.util.Arrays.ArrayList 类型的类(它是 Arrays 的内部类)。我发现的问题是,很容易认为使用的是 java.lang.ArrayList,但它们的接口非常非常不同。
【讨论】:
public static <T> List<T> asList(T... items) { return new ArrayList(Arrays.asList(items)); }
你可以这样做:
import static java.util.Arrays.*;
...
List<List<Integer>> list = asList(
asList( 1, 2, 3 ),
asList( 4, 5, 6 ),
asList( 6, 7, 8 ) );
【讨论】:
Arrays.asList() 仅在您需要只读 List 时才有用,而您从中获得的 List 对象甚至不太适合。但它是静态初始化 List 对象的最短方法,Java 必须提供开箱即用的功能,并且在许多用途中效果都很好。
您可以通过在代码中添加静态块来实现。
private static List<List<Integer>> list = new ArrayList<List<Integer>>();
static {
List<Integer> innerList = new ArrayList<Integer>(3);
innerList.add(1);
innerList.add(2);
innerList.add(3);
list.add(innerList);
//repeat
}
【讨论】: