我遇到格式问题,导致Java编译被拒绝。
此代码在Netbeans中有效,但是Web编译检查器拒绝接受它。
我正在做一个迭代器,希望在链表中放置随机排序的节点数组。
使用
例如,在代码内,“ int [] vals = new int [numEntries]”可以正常工作。这是整数列表。我想要一个Node
[unchecked] unchecked conversion
required: RandomizedQueue<Item>.Node<Item>[]
found: RandomizedQueue.Node[]
where Item is a type-variable:
Item extends Object declared in class RandomizedQueue
有问题的行是Node
我尝试了Node
public Iterator<Item> iterator() {
Iterator<Item> it = new Iterator<Item>() {
private final Node<Item>[] elements = init1();
private int indx = 0;
private Node<Item>[] init1() {
Node<Item>[] ret1 = new Node[numEntries];
Node<Item> curr;
int[] vals = new int[numEntries];
int i, j, val;
int[] free = new int[numEntries];
for( i=0; i<numEntries; i++) {
free[i] = i;
}
for( i=0; i<numEntries; i++) {
j = numEntries-i;
val = StdRandom.uniform(j);
vals[i] = free[val];
free[val] = free[j-1];
}
for( i=0; i<numEntries; i++) {
curr = head;
j = vals[i];
while( j-- > 0) curr = curr.next;
ret1[i] = curr;
}
return ret1;
}
答案 0 :(得分:0)
https://www.javarticles.com/2014/12/arrays-of-parameterized-type.html
基本上,您不能具有类型化的数组,必须使用ArrayList或其他方法。
话虽如此,在我看来,您似乎对链接列表的用途有些困惑
因此,在Java中,数组的大小是固定的,但允许您根据数组中的位置立即查找一个值。如果您不希望数组有太大变化,那很好,但是如果您有一个由5个字符组成的数组a,b,c,d,e
,并且想在中间添加g,那么您要做的就是创建一个新的大小为6的数组,然后复制所有值并在需要的地方插入所需的值。还不错,但是想象一下该数组有100,000个字符而不是5个字符,复制所有可能导致性能问题的字符,特别是如果它经常发生的话
要解决此问题,有链表,因为将值链接在一起,所以很容易为g创建一个新节点,将c.next
指向g,然后将g.next
指向d,您就没有了复制一个疯狂的大小的数组,一切都很好。不幸的是,您没有能力立即查找第x个项目,必须先获得第一个项目,然后调用node.next()
x次,但是在许多情况下,您会根据不需要这个位置。
您要将链接列表的所有节点存储在数组中,这是多余的,并使链接列表毫无意义,因为您可能只拥有一个Items数组,而只需通过递增您所使用的任何索引变量来获取下一个项目正在用于访问数组。
考虑迭代器需要做什么,它需要从列表的开头开始,然后遍历列表中的所有值。这几乎就是链接列表的用途,但是数组也可以完成此工作。如果要使用链表,则不需要存储节点private final Node<Item>[] elements = init1();
的数组,而是要存储的是当前节点private Node currentNode = init1();
-需要更改init1以返回FIRST节点。然后,在迭代器next()
函数中,您只需执行类似的操作
Node<Item> toReturn = currentNode;
currentNode = currentNode.next();
return toReturn;
您可以通过完全放弃链接列表,而仅使用常规Item []数组private final Item[] elements = init1();
,然后使用递增索引遍历值来实现相同的结果,无论哪种方式最终结果都是相同的