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

Posted

技术标签:

【中文标题】如何静态初始化二维列表?【英文标题】:How do I initialize a two-dimensional List statically? 【发布时间】:2011-09-08 03:30:36 【问题描述】:

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

这行得通:

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

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

【问题讨论】:

【参考方案1】:

如果您创建一个辅助方法,代码看起来会更好一些。例如

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,但它们的接口非常非常不同。

【讨论】:

Arrays.asList() 执行上面列出的功能。 为什么在 java.util.Arrays.asList 这样做的时候需要创建一个辅助方法?请参阅 x4u 的答案。 @JustinKSU & @ditkin:这不是 100% 相同的,请查看我在 x4u 答案上发表的评论。 @Augusto 您能否将您对 Arrays.asList 的疑虑添加到此答案中。你提到了头痛,你能详细说明一下吗?这将使这个答案非常有用,并消除人们可能对重新发明存在于 java 库中的解决方案的任何疑问。 2016 年也不错。顺便说一句,它可以简化为:public static &lt;T&gt; List&lt;T&gt; asList(T... items) return new ArrayList(Arrays.asList(items)); 【参考方案2】:

你可以这样做:

import static java.util.Arrays.*;

...

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

【讨论】:

我避免使用 Arrays.asList() 因为它返回“java.util.Arrays.ArrayList”,而不是 java.util.ArrayList。这个小事实让我很头疼,这就是为什么我使用自己的“asList()” 是的,你是对的。 Arrays.asList() 仅在您需要只读 List 时才有用,而您从中获得的 List 对象甚至不太适合。但它是静态初始化 List 对象的最短方法,Java 必须提供开箱即用的功能,并且在许多用途中效果都很好。 你是对的,但根据我的经验,最好避免它。我见过一些非常优秀的开发人员花费数小时试图找到与此相关的错误。内部类也被称为 ArrayList 对我来说是一个足够大的混淆源,所以我宁愿把它放在一边。 确实如此,我同意这是实施此方法的人的一个非常不幸的名称选择。【参考方案3】:

您可以通过在代码中添加静态块来实现。

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) ) 在单行代码中生成内部元素。

以上是关于如何静态初始化二维列表?的主要内容,如果未能解决你的问题,请参考以下文章

python中二维列表(list)的初始化

语法错误:创建一个用零填充的二维列表

二维list 不同长度列表 初始化 (Python)

Python中的二维列表编辑

C++中二维列表数组的动态初始化

如何在python中创建二维列表