【问题标题】:Java 2D array of ArrayLists [duplicate]ArrayLists的Java 2D数组[重复]
【发布时间】:2013-06-07 20:38:53
【问题描述】:

我有一个大小为 nXm 的 2D 矩阵,其中每个单元格包含未知数量的 Integer 类型的值(因此我必须使用 List 才能动态添加内容,并且必须使用 2D 数组 nXm 因为数组易于访问和编写代码)。 请

  • 在向我推荐任何其他数据结构之前请先在下面回答我的问题,然后讨论为什么我不应该这样做,并选择您认为会更好、更高效的方法:

如何为下面的变量分配内存

 ArrayList<Integer>[][] i2DArrayList;

我知道在某些时候我必须这样做。但是在此之前,我必须做一些我不记得知道的其他内存分配。你能在这件事上指导我吗?

for (int i = 0; i < n; i++) {   
            for (int j = 0; j < m; j++) {
                i2DArrayList[i][j] = new ArrayList<Integer>();    
    }
}

我已经知道如何在一维中做到这一点:

ArrayList<Integer>[] i1DArrayList;

i1DArrayList = new ArrayList[n]; 
    for (int i = 0; i < i1DArrayList.length; i++) {
        i1DArrayList[i] = new ArrayList<Integer>();
    }

【问题讨论】:

  • 我想你想要一个ArrayList&lt;ArrayList&lt;Integer&gt;&gt;
  • 不,就像我说的我对 ArrayList[][] i2DArrayList 没问题
  • 不幸的是you can't create array with generic type。我希望你最终会得到ArrayList&lt;ArrayList&lt;Integer&gt;&gt;,因为它是最适合你的方法。
  • 我编辑了我的问题@Pshemo:我已经知道如何在 1D 中做到这一点......
  • @Cgraphics 但这会导致类型安全问题。如果你想忽略它们,那好吧,这是你的选择。

标签: java arrays arraylist


【解决方案1】:

只需使用多维数组初始化器:

ArrayList<Integer>[][] i2DArrayList = new ArrayList<Integer>[n][m];

相当于:

ArrayList<Integer>[][] i2DArrayList = new ArrayList<Integer>[n][];
for (int i = 0; i < n; i++) {   
    i2DArrayList[i] = new ArrayList<Integer>[m];
}

Java 不允许您分配 泛型数组。也就是说,您不能创建new T[]new List&lt;T&gt;[]。原因是数组还存储它们的元素类型以允许在运行时检查元素。但是,类型擦除会在编译时删除这些泛型类型,因此不能将有效的元素类型分配给 new T[]new List&lt;T&gt;[]。不过有一些解决方案:

  • 也可以使用一些Collection 类型来存储矩阵。例如:

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

    但是,这很快就会变得丑陋。

  • 您可以创建自己的非泛型入口类:

    class Entry {
        final List<Integer> entries = new ArrayList<Integer>();
    }
    
    Entry[][] i2DArrayList = new Entry[n][m];
    
  • 如果你知道你的矩阵是稀疏的,你可以使用 Map&lt;Position, List&lt;Integer&gt;&gt; 来代替,Position 是一个带有 xy 字段的值类。

【讨论】:

  • 该死,Java 和它的蹩脚泛型又来了。
  • 不是泛型的问题...
  • 更新了我的答案。 @Legend,你到底是什么意思?
  • 您之前的答案的泛型很好。不完美,因为您不必在构造函数中指定泛型。代码是行不通的。
  • @Legend 没错,我一开始就陷入了这个陷阱。这是an example 说明为什么您不能 这样做。您还看到了什么其他错误?
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 2013-10-03
  • 2019-05-14
  • 2012-08-12
  • 2016-11-03
  • 2018-02-15
  • 2017-05-10
  • 2016-02-16
相关资源
最近更新 更多