【问题标题】:2D dynamic array using ArrayList in Java在 Java 中使用 ArrayList 的二维动态数组
【发布时间】:2011-09-08 02:28:39
【问题描述】:

我需要实现一个二维动态数组。行数是固定的,比如 n。但是每行的列数不是固定的和等价的。例如,第一行有 3 个元素,第二行有 5 个元素。如何使用 Arraylist 在 Java 中执行此操作。谢谢。

【问题讨论】:

  • 是否 - 在您的示例中 - 第一行总是有 3 个元素?如果是这样,您为什么不简单地创建一个(例如)Something[][] s = new Something[numRows][]s[0] = new Something[3]

标签: java multidimensional-array arraylist


【解决方案1】:

List<List<Foo>> 怎么样?

例如:

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

List<Foo> row1 = new ArrayList<Foo>();
row1.add(new Foo());
row1.add(new Foo());
row1.add(new Foo());
list.add(row1);

List<Foo> row2 = new ArrayList<Foo>();
row2.add(new Foo());
row2.add(new Foo());

list.add(row2);

【讨论】:

  • list和ArrayList有什么区别?为什么只是 ArrayList> list = new ArrayList>();谢谢
  • List 是一个 interfaceArrayList 是它的具体实现。如果你有List&lt;Foo&gt; 那么你可以参考LinkedList 或者其他一些实现
【解决方案2】:
ArrayList<ArrayList<SomeObject>> twodlist = new ArrayList<ArrayList<SomeObject>>();
ArrayList<SomeObject> row = new ArrayList<SomeObject>();
row.add(new SomeObject(/* whatever */));
// etc
twodlist.add(row);
row = new ArrayList<SomeObject>();
// etc

【讨论】:

  • 几乎,除了 2dlist 不是有效的 Java 标识符。 :)
  • @Ted Hopp,在哪里可以看到该标识符? ;-) 感谢您的更正 :-)
【解决方案3】:

因为这个维度是固定的,所以你可以使用数组来表示行:

@SuppressWarnings("unchecked")
ArrayList<T>[] arr = new ArrayList[ fixedsize];

或使用嵌套的 ArrayLists:

List<List<T>> list = new ArrayList<List<T>>( fixedsize );

【讨论】:

  • 被 java 编译器禁止。你不能创建一个通用数组。
  • 不,这不是禁止的!您可以很好地创建参数化类型的数组,并且可以测试我的代码。它按预期编译和工作。
  • 哎呀,对不起,你说得对,我的代码有错误,可以省略演员表。我现在修复了它,它现在可以编译了。
  • 啊,是的,我们开始了。以前没看到。我可以假设这是类型安全的,考虑到实际变量不是原始类型吗?
  • 它实际上比泛型集合类型更安全,因为它保证数组中永远不会有不是数组组件类型实例的对象。因此,您可以 100% 确定数组将始终包含 ArrayList 对象(或 null),但绝不会包含字符串。 ArrayList&lt;ArrayList&lt;T&gt;&gt; 在技术上可以容纳您喜欢的任何对象,并且您可以设法将字符串放入其中,尽管您需要使用一些讨厌的强制转换或反射来做到这一点。除此之外,数组和集合类型的类型安全或缺乏安全性是相同的。
【解决方案4】:

试试:

ArrayList<ArrayList<DataType>> array = new ArrayList<ArrayList<DataType>>();
for (int i = 0; i < n; ++i) {
    array.add(new ArrayList<DataType>());
}

【讨论】:

  • 你不能混合使用数组和泛型。
  • 更正:您可以使用@SuppressWarnings("unchecked"),但不鼓励这样做。
  • 但是如何为代表一行的每个 ArrayList 添加条目呢?谢谢
  • @MarioP:你什么意思?另外,请参阅this answer 了解完整说明。
  • @user288609: array.get(rowNumber).add(element)(就像我的answer
【解决方案5】:

您可以创建一个 ArrayList 元素数组,因为您的行数是固定的。

ArrayList[] dynamicArray = new ArrayList[n]();

注意:您需要在数组的每个条目中分配一个 ArrayList 对象。所以...

for (int loop = 0; loop < n; loop++)
dynamicArray[loop] = new ArrayList();

或者,如果您希望行和列都是动态的,您可以创建一个 ArrayList 的 ArrayLists....

ArrayList<ArrayList<T>> dynamicArray = new ArrayList<ArrayList<T>>();

再一次,您需要在 dynamicArray 的每个新条目中创建一个数组列表。

【讨论】:

    【解决方案6】:

    如果行数是固定的,试试这样的:

    ArrayList<MyObject>[] = new ArrayList<MyObject>[fixedRows]
    

    【讨论】:

    • 被 java 编译器禁止。你不能创建一个通用数组。
    • 需要@SuppressWarnings("unchecked") 才能始终正常工作。
    • 该死的Java泛型...然后ArrayList[] = new ArrayList[fixedRows]。吸它Java。
    • @erikzetta:这确实很烦人,当我遇到这样的情况时,我已经放弃并转而使用全泛型——无论如何开销都可以忽略不计。
    【解决方案7】:
    List<ArrayList<SomeObject>> twoDList = new ArrayList<List<SomeObject>>(n);
    for( int i=0; i<n; i++ )
        twoDList.add( new ArrayList<SomeObject>() );
    

    用作:

    twoDList.get(rownumber).add(newElementInColumn);
    

    【讨论】:

      【解决方案8】:

      我将创建一个 ArrayList 数组(如果行数为 3,则 ArrayList[3] rows = new ArrayList[3])然后为每一行创建列类并将它们插入到 ArrayList 中。然后将 ArrayList 放入 Array 中。行数组的索引可用于跟踪行号。记住数组从 0 开始索引,所以行号是 rows[index+1]

      【讨论】:

        【解决方案9】:

        如你所说,你可以制作一个arraylists数组,并使用ArrayList(int initial capacity)构造函数来设置每一列的容量:

        ArrayList<YourObject>[] rows=new ArrayList<YourObjects>[n];
        for(i=0;i<n;i++){
        rows[i]=ArrayList<YourObjects>(initialsize);
        }
        

        【讨论】:

        • “ArrayList 是原始类型。对泛型类型 ArrayList 的引用应该被参数化” - 错误的编码风格。 ClassCastException的高风险。
        • 很好——感谢您的更正!上面的代码已经修复。
        • 显然,我需要重温一下我的 ArrayList。 ^^
        猜你喜欢
        • 1970-01-01
        • 2017-01-18
        • 2018-09-03
        • 1970-01-01
        • 1970-01-01
        • 2020-10-04
        • 2012-06-23
        • 2012-11-18
        • 2012-04-17
        相关资源
        最近更新 更多