1

我有一个实现的数据结构,称为List(它是一个单链表)。我的 Java 程序中有以下代码:

List[] Adjacent = new List[N]; // Trying to create an array of N List objects

假设 N = 6。我想Adjacent成为一个包含六个元素的数组,其中每个元素List本身就是一个对象。但是当我尝试访问它时,该数组实际上是一个包含 N 个空引用的数组。到底是怎么回事?

当然我做了以下来解决我的问题:

for (int p = 0; p < N; p++) 
    Adjacent[p] = new List();

但这不是我真正想要的。有没有更有效/更好的方法来做到这一点?

4

4 回答 4

3

当你有

List list;

这是一个参考,而不是一个对象。要拥有一个对象,您必须使用new List(...). 没有办法解决这个问题。您必须初始化对实际对象的引用。

此外,创建一个与已经内置的名称相似的名称的类要糟糕得多。我建议您使用这样的 List 列表:

List<List<String>> listofLists = new ArrayList<>();
for(int i = 0; i < N; i++) listOfLists.add(new ArrayList<>());

重用现有类对您来说效率更高。

于 2013-10-01T11:50:01.777 回答
2

Java 8 将有一个“不错”的方法:

MyObject[] array=Stream.generate(MyObject::new).limit(N).toArray(MyObject[]::new);

Stream.generate(MyObject::new)将创建由 a 提供的无限对象流,在我们的例子中,Supplier它是默认构造函数,显然限制了对象的数量,并将对象存储到由 an构造的数组中,该数组使用设置为等效的指定构造数组在我们的例子中。流将提供该参数的限制。MyObjectlimit(N)toArray(MyObject[]::new)IntFunction<A[]>intnew MyObject[i]Ni

虽然最后一部分并不是真正的溪流精神。通常,您会将流定向到处理对象的消费者并完全省略数组。

于 2013-10-01T12:11:12.557 回答
0

没有。创建新数组后,您应该手动填充它。当然我们有Arrays.fill(array, object)方法,但它会将相同的对象设置到数组中的所有位置。

于 2013-10-01T11:52:25.180 回答
0

假设 N总是6 ...

List[] l = new List[]{new List(),new List(),
       new List(),new List(),new List(),new List()};
于 2013-10-01T12:03:18.430 回答