如何静态初始化一个二维列表?

25

我该如何静态地初始化多维列表?

这个方法可行:

List<List<Integer>> list = new ArrayList<List<Integer>>();

但我想要用一些静态列表(如:(1,2,3),(4,5,6)和(7,8,9))来初始化该列表。

3个回答

28

这是一个旧的答案,但是事情有些变化。对于Java 9+,可以使用List.of()方法来完成此操作,该方法返回一个不可变的List,它是AbstractImmutableList子类。

import java.util.List;

List<List<Integer>> list = List.of(
                               List.of(1, 2, 3),
                               List.of(4, 5, 6),
                               List.of(7, 8, 9)
                           );

对于旧版本的Java或者需要可变的List,旧的答案仍然适用:

2011年的答案

如果您创建一个辅助方法,代码看起来更加优美。例如:

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;
    }
}

然后你可以使用静态导入 (with a static import) 的方式进行操作。

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,但它们的实现方式非常不同。

上面的评论也已经过时了,在Java 9+中请使用List.of(E...elem)


Arrays.asList()执行上述功能。 - JustinKSU
当 java.util.Arrays.asList 可以实现此功能时,为什么需要创建帮助程序方法?请参见 x4u 的答案。 - ditkin
@JustinKSU和@ditkin:它不是100%相同,请检查我在x4u答案下留下的评论。 - Augusto
@Augusto,请您把对Arrays.asList的疑虑加入到这个答案中。您提到了困扰,能否详细说明一下。这将使得该答案非常有用,并消除人们关于重新发明Java库中已有解决方案的疑虑。 - ditkin
1
2016 年也很不错。顺便说一句,它可以被简化为:public static <T> List<T> asList(T... items) { return new ArrayList(Arrays.asList(items)); } - developer033
显示剩余7条评论

10
您可以这样做:
import static java.util.Arrays.*;

...

List<List<Integer>> list = asList(
    asList( 1, 2, 3 ),
    asList( 4, 5, 6 ),
    asList( 6, 7, 8 ) );

1
我避免使用Arrays.asList(),因为它返回的是"java.util.Arrays.ArrayList"而不是"java.util.ArrayList"。这个小事实曾经给我带来了很多麻烦,所以我使用自己的"asList()"。 - Augusto
是的,你说得对。Arrays.asList() 只有在需要只读列表时才有用,而且从中获取的 List 对象甚至不太适合这种情况。但它是 Java 提供的静态初始化 List 对象的最短方式,对于许多目的来说它都能很好地工作。 - x4u
你说得没错,但根据我的经验最好还是避免使用它。我见过一些非常优秀的开发者花费数小时来查找与此相关的错误。内部类也被称为ArrayList,这已经足够让我感到困惑了,所以我更喜欢将其放在一边。 - Augusto
这是真的,我同意那些实现这个功能的人在选择名称时非常不幸。 - x4u

8
你可以通过在代码中添加静态块来实现这一点。
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
}

你也可以使用 list.add(Arrays.asList(1,2,3)) 来在一行代码中生成内部元素。 - vikramvi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接