我从来没有弄清楚创建2D ArrayList的正确方法

时间:2015-06-11 13:35:21

标签: java arrays arraylist

List<ArrayList<Planet>> NAME = new ArrayList<ArrayList<Planet>>(N);
List<List<Planet>> NAME = new ArrayList<ArrayList<Planet>>(N);
ArrayList<ArrayList<Planet>> NAME = new ArrayList<ArrayList<Planet>>(N);

我无法说出这三种表情的区别。后来我才意识到List可能用于声明,因为它是一个接口而ArrayList可以用于启动,因为它是一个类。我在项目中使用了第一个语法并找到了

  

发现:java.util.ArrayList&gt;

     

必需:java.util.ArrayList&gt;

     

List<List<Planet>> Name = new ArrayList<ArrayList<Planet>>(N);

我在标题中添加了。

import java.util.ArrayList;
import java.util.List;

在另一个地方,我将Planet对象添加到ArrayList

for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (i == j) continue;
                NAME[i].add(planets[j]);
            }
        }

编译器报告,

  需要

数组,但是java.util.ArrayList&gt;结果

          planetsForNetForceSetting[i].add(planets[j]);

有人可以告诉我这个的原因吗?

3 个答案:

答案 0 :(得分:3)

您正尝试从List的指定位置检索数据,例如ArrayNAME[i].add(planets[j]);,无法完成的任务。

要从ArrayList获取数据,您必须使用get(int)方法。这样:NAME.get(i)代替NAME[i]

然后,您的方法必须

for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            if (i == j) continue;
            NAME.get(i).add(planets[j]);
        }
    }



关于三个表达式的区别,以及为什么使用接口来声明List<Object> list = new ArrayList<Object>而不是类本身look at this question

答案 1 :(得分:1)

在你的3个表达式中,按照你提到的顺序,第二个是最通用的,然后是第一个,然后是第三个。
这意味着当您使用List<Planet> listObj时,您可以使用listObj指向List接口的任何实现。当您执行ArrayList<Planet> listObj时,您可以使用listObj仅指向ArrayList类型的对象
无论是1维还是N维,这都是正确的。

更通用的类型和首选的类型将使用List<Object> listObj,这意味着您可以使用listObj指向List接口的任何实现,您也可以在列表中使用可以放任何物体。当您使用List<Planet> listObj时,您只能放置Planet个对象。

对于编译问题,你的代码不足以找出根本原因,因为我看不到什么planetsForNetForceSetting,只是确保你把正确的对象放在正确的位置。就像我上面解释的那样。

希望这有帮助!!!

答案 2 :(得分:1)

第一个List<T>是一个按类型T参数化的java接口。 ArrayList<T>是接口List<T>的具体实现。因此,您可以指定List<Integer> list = new ArrayList<Integer>();这样,变量list的类型List<Integer>会隐藏特定的实现ArrayList<T>

然后是以下几行:

List<ArrayList<Planet>> planetsList = new ArrayList<ArrayList<Planet>>();

创建planetsList类型的变量List<ArrayList<Planet>>,它是数组列表的列表。实际的外部列表实现是ArrayList<ArrayList<Planet>>

List<List<Planet>> planetsList2 = new ArrayList<ArrayList<Planet>>();

无法编译,因为您无法将ArrayList<ArrayList<Planet>>分配给List<List<Planet>>请参阅此问题以更深入地解释原因Why can't you have a "List<List<String>>" in Java?

ArrayList<ArrayList<Planet>> planetsList3 = new ArrayList<ArrayList<Planet>>();

将创建类型为planetsList3的变量ArrayList<ArrayList<Planet>>

您需要同时导入java.util.Listjava.util.ArrayList类型,因为您在代码中直接引用它们。

最后。您不能通过数组索引语法items[index]=item;将项目分配给列表索引,因为List<ItemType> items;是接口而不是数组。这些在java中完全不同。