我实现了一个java类,但是出现了两个我无法解决的错误。 ERROR1:
incompatible types
Required: RandomizedQueue<Item>
Found: Item
误差2:
can not find symbol
Symbol: valuable last
location:valuable next of type Item
public class RandomizedQueue<Item> implements Iterable<Item> {
private int number=0;
private Node First=null;
private class Node {
Item item;
Item next=null;
Item last=null;
}
private Node Random() {
double r = Math.random();
int n = (int) (r*number);
if(n==0) n=1;
Node ob=First;
for(int i=0;i<(n-1);i++) {
ob = ob.next; //Error1
}
return ob;
}
public RandomizedQueue() {
Node empty=new Node();
}
public boolean isEmpty() {
return number==0;
}
public int size() {
return number;
}
public void enqueue(Item item) {
if(item==null) throw new NullPointerException();
Node oldfirst = First;
First = new Node();
First.item = item;
First.next = oldfirst; //Error1
oldfirst.last = First;
number++;
}
public Item dequeue() {
Node ob=Random();
Item back = ob.item;
Node temp = ob.last;
temp.next = ob.next;
ob.next.last = temp; //Error2
return back;
}
public Item sample() {
return Random();
}
public Iterator<Item> iterator() { //Error:cannot find symbol symbol:class Itertor
return IndepentRandomIterator();
}
private class IndepentRandomIterator implements Iterator<Item> {
private RandomizedQueue<Item> iq = new RandomizedQueue<Item>();
Node scan = First;
public IndepentRandomIterator() {
while(scan != null) {
iq.enqueue(scan.item);
scan=scan.next;
}
}
public boolean hasNext() {
return iq.number >0;
}
public void remove() {
throw new UnsupportedOperationException();
}
public Item next() {
if(iq.number==0) throw new java.util.NoSuchElementException();
return iq.dequeue();
}
}
public static void main(String[] args) {
RandomizedQueue<String> test = new RandomizedQueue<String>();
test.enqueue("Luo");
test.enqueue("Jiebin");
test.enqueue("is");
test.enqueue("genious");
test.dequeue();
test.dequeue();
StdOut.println("Is it empty?"+test.isEmpty());
StdOut.println("Size: "+test.size());
StdOut.println("A sample: "+test.siample());
Iterator<String> it = test.iterator();
while(test.hasNext()) {
String s = it.next();
StdOut.println(s);
}
}
}
答案 0 :(得分:2)
由于您没有提供Node
class
第二个错误:
你不会创建你班级的实例。
public Iterator<Item> iterator() { //Error:cannot find symbol symbol:class Itertor
return IndepentRandomIterator();
}
你必须提供一个能够返回的机会。
public Iterator<Item> iterator() { //Error:cannot find symbol symbol:class Itertor
return new IndepentRandomIterator();
}
答案 1 :(得分:1)
我收到了2个以上的编译错误。
首先,在班级的第一行:
public class RandomizedQueue<Item> implements Iterable<Item> {
是Item
实际类的名称,还是类的占位符?
如果它是一个类,那么你的第一个错误是抱怨它在这个类上找不到“next”字段 - 可能它没有定义或不可见。
如果Item是通用占位符,那么您需要像这样定义RandomizedQueue:
public class RandomizedQueue<Item extends MyClass> implements Iterable<Item> {
MyClass确实有一个名为next
的可见字段
其次,代码:
Node oldfirst = First;
First = new Node();
First.item = item;
First.next = oldfirst; //Error1
在我看来,您正在尝试将节点转换为项目。但究竟什么是Item,它与Node有什么关系?
我无法看到你在这里想做什么。 您似乎并不真正理解inheritance,在开始使用泛型之前,您确实需要了解它。
答案 2 :(得分:1)
对于第一个错误,您尝试为ob
分配ob.next
的值。 ob
是Node
,但ob.next
是Item
。显然,Item
不是Node
,因此您无法将Item
分配给Node
。
同样适用于该行:
first.next = oldfirst;
first.next
是Item
,但oldFirst
是Node
。您无法将Node
分配给Item
类型的变量。
对于错误cannot find symbol symbol:class Itertor
。那是因为您需要将它放在代码的最顶层:
import java.util.Iterator;
在线:
return IndepentRandomIterator();
代码尝试调用方法IndepentRandomIterator()
。要让它调用IndepentRandomIterator
类的构造函数,您需要在new
之前添加关键字IndepentRandomIterator()
,如下所示:
return new IndepentRandomIterator();
对于这行的错误:
ob.next.last = temp;
代码尝试访问对象last
的字段ob.next
。我想你想访问对象ob.last
。但这仍然是一个问题,因为那样你就会得到第一个错误。 ob.next
和ob.last
都属于Item
类型,但temp
属于Node
。
在代码末尾,您尝试使用StdOut.println()
。 StdOut
不存在;你应该使用System.out.println()
。