我正在尝试创建一个优先级,它保持其元素(整数对)与自然顺序相反。我在网站上发现了严厉的提示,但在每种情况下它都给出了相同的错误订单。
PriorityQueue<Pair> pq = new PriorityQueue(4,
new Comparator<Pair>() {
public int compare(Pair a1, Pair a2) {
return a2.value.compareTo(a1.value);
}
});
pq.add(new Pair(1,15));
pq.add(new Pair(2,58));
pq.add(new Pair(3,55));
pq.add(new Pair(7,23));
Iterator<Pair> it = pq.iterator();
while(it.hasNext()) {
System.out.println(it.next().value);
}
这是Pair类
public class Pair implements Comparable {
public Integer name;
public Integer value;
public Pair(int name, int value) {
this.name = name;
this.value = value;
}
public int getname(){
return name;
}
public int getvalue() {
return value;
}
public int compare(Pair o1, Pair o2) {
Pair a1 = (Pair)o1;
Pair a2 = (Pair)o2;
if(a1.value>a2.value) {
return 1;
}
else if(a1.value<a2.value) {
return -1;
}
return 0;
}
@Override
public int hashCode() {
int hash = 3;
return hash;
}
@Override
public boolean equals(Object o) {
Pair a2 = (Pair)o;
return this.name == a2.name && this.value == a2.value;
}
public int compareTo(Object o) {
Pair a2 = (Pair)o;
if(this.value>a2.value) {
return 1;
}
else if(this.value<a2.value) {
return -1;
}
return 0;
}
}
如果我使用“new PriorityQueue()”构造函数,它会给出正确的自然顺序。 谢谢你的时间, 标记
答案 0 :(得分:3)
来自PriorityQueue.iterator()
的文档:
返回此队列中元素的迭代器。迭代器不会以任何特定顺序返回元素。
如果您想按优先顺序排除这些内容,请继续致电poll()
,直至其返回null
:
Pair pair;
while((pair = pq.poll()) != null) {
System.out.println(pair.value);
}
打印58,55,23,15,正如您所寻找的那样。
答案 1 :(得分:0)
而不是“return a2.value.compareTo(a1.value);” 你应该直接使用((a2.value&gt; a1.value)?1:((a2.value == a1.value)?0:-1));