有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我从来没有找到创建2D 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可以用于初始化,因为它是一个类。我在我的项目中采用了第一种语法并找到了

found : java.util.ArrayList>

required: java.util.ArrayList>

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]);
            }
        }

编译报告

array required, but java.util.ArrayList> found

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

有人能告诉我为什么吗


共 (3) 个答案

  1. # 1 楼答案

    第一个List<T>是一个java接口,由类型T参数化ArrayList<T>是接口{}的具体实现。因此,您可以通过这种方式分配List<Integer> list = new ArrayList<Integer>();,变量list将具有类型List<Integer>,它将隐藏特定的实现ArrayList<T>

    然后是以下几行:

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

    创建类型为List<ArrayList<Planet>>的变量planetsList,它是数组列表的列表。其中,实际的外部列表实现是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>>();
    

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

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

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

  2. # 2 楼答案

    您正试图从List的给定位置检索数据,就像Array这里:NAME[i].add(planets[j]);,什么是不能做的

    要从^{}获取数据,必须使用^{}方法。这样: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

  3. # 3 楼答案

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

    一种更通用且更可取的类型是使用List<Object> listObj,这意味着您可以使用listObj指向List接口的任何实现,也可以在列表中放置任何对象。使用List<Planet> listObj时,只能放置Planet对象

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

    希望这有帮助