关于java:我从未弄清楚创建2D ArrayList的正确方法

I never figure out the correct way to create an 2D ArrayList

1
2
3
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);

我不知道这三种表达有什么不同。我后来意识到,列表可能是用于声明的,因为它是一个接口,而ArrayList可以用于初始化,因为它是一个类。我在我的项目中采用了第一种语法并发现

found : java.util.ArrayList>

required: java.util.ArrayList>

List> Name = new ArrayList>(N);

我在标题处添加了。

1
2
import java.util.ArrayList;
import java.util.List;

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

1
2
3
4
5
6
for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (i == j) continue;
                NAME[i].add(planets[j]);
            }
        }

编译器报告,

array required, but java.util.ArrayList> found

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

有人能告诉我原因吗?


您试图从List的给定位置检索数据,如ArrayNAME[i].add(planets[j]);,无法执行的操作。

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

那么,你的方法必须是

1
2
3
4
5
6
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 list = new ArrayList,而不是类本身,请看这个问题。


第一个EDOCX1×20是由EDCOX1型21参数表示的Java接口。ArrayList是接口List的具体实现。因此,您可以通过这种方式分配List list = new ArrayList();,变量List将具有类型List,它将隐藏特定的实现ArrayList

然后是以下几行:

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

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

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

不会编译,因为您不能将EDCOX1的30个引用分配给EDCOX1(32)。这是一个更深入的解释,为什么在Java中你不能有一个"列表<列表>字符串>"?

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

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

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

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


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

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

对于您的编译问题,您的代码不足以找出根本原因,因为我看不到planetsForNetForceSetting的内容,但请确保将正确的对象放在正确的位置。就像我上面解释的。

希望这有帮助!!!!