2016-10-01 85 views
0

我在为数据结构类分配时遇到了很多麻烦。我需要使用双向链表实现一个双端优先级队列,但我的教授提供的用于测试它的代码中有一些奇怪的东西。我不明白的部分是为什么他使用DoubleEndedPriorityQueue,但添加了对象而不是整数。我得到的错误是没有方法添加(对象),这是真的。通用双端优先级队列的问题

public class Test1ForAssign2 { 
public static void main(final String[] args) { 

final DoubleEndedPriorityQueue<Integer> sampleL = (DoubleEndedPriorityQueue<Integer>)new ListDoubleEndedPriorityQueue(); 

sampleL.add((Object)5); 
sampleL.add((Object)12); 
sampleL.add((Object)5); 
sampleL.add((Object)1); 
sampleL.add((Object)(-7)); 
sampleL.add((Object)3); 
System.out.println("Priority Queue Contents: "); 
System.out.println("Deleting: " + sampleL.deleteMin()); 
System.out.println("Deleting: " + sampleL.deleteMax()); 
} 

public interface DoubleEndedPriorityQueue<AnyType>{ 
void makeEmpty (); 
void add (AnyType x); 
AnyType deleteMin (); 
AnyType deleteMax (); 
AnyType findMin (); 
AnyType findMax (); 
boolean isEmpty (); 
} 

回答

0

正如你所说的,这个代码目前不会编译 - 你需要要么使sampleLDoubleEndedPriorityQueue<Object>,或铸整数而不是整数

sampleL.add((Integer)5); 

还有一种更好的方式拿到包装类型:

sampleL.add(Integer.valueOf(5)); 

我觉得这里的意图可能是为了避免隐性自动装箱 - java会包装和原始类型之间的自动转换,但明确表达这一点很好。特别是在泛型方面,这可能会让人感到困惑,并且(特别是在学习时)不依赖这些快捷方式是很好的。

+0

谢谢@ hugh这就是我的想法。顺便说一句,你可以帮助我用别的东西吗?他也给了我们这个代码: private Comparator <?超级AnyType> cmp; 私有节点 first = null; 私有节点 last = null; 但我不知道如何使用比较器,我一直试图做cmp.compare(obj1,obj2),但它总是给我一个零点异常,我敢肯定,这两个对象都不为空。我认为这是因为Integer类没有实现比较器,但是他如何期望我们这样做呢? –

+0

(通常在一个地方发布几个问题是不好的做法,但我会尝试给出一些指针)Integer不实现Comparator,但它确实实现了Comparable - 如果您搜索那些应该能够查找文章的人这些如何不同。如果其中任何一个参数为null,'compare'可以抛出NPE,否则听起来像'compare'中的代码不正确(可能使用不带空值检查的可空字段)。你在使用调试器吗?使用一个会使你的生活*变得更好。 – hugh