我正在尝试在我的代码中使用优先级队列,并且出于某种原因,当我删除对象时,它们不是有序的。你知道我做错了什么吗? 这是我的代码:
构造函数:
recordedsong = new PriorityQueue<recordedNote>(50, new Comparator<recordedNote>()
{
public int compare(recordedNote n1, recordedNote n2)
{
long l = n1.rt()-n2.rt();
int i = (int)l;
return i;
}
});
其中每个recordedNote都有一个long值,返回我的方法rt()。
但是当我打电话时
while (!Song.isEmpty())
{
recordedNote temp = (recordedNote)Song.remove();
然后为每个打印temp.rt(),所有数字都不正常。而不仅仅是相反的顺序,而是整个地方,比如1103,0,500,0,220这样的订单。
你能看出我的构造函数是否有问题吗?
谢谢!
答案 0 :(得分:2)
删除应该工作,事实上它在我创建的一个小示例程序中可以正常工作,以帮助回答这个问题:
import java.util.Comparator;
import java.util.PriorityQueue;
public class TestPriorityQueue {
public static void main(String[] args) {
long[] noteTimes = {1103L, 0L, 500L, 0L, 220L, 1021212812012L};
PriorityQueue<RecordedNote> noteQueue = new PriorityQueue<RecordedNote>(10,
new Comparator<RecordedNote>() {
@Override
public int compare(RecordedNote o1, RecordedNote o2) {
Long time1 = o1.getTime();
Long time2 = o2.getTime();
// uses Long's built in compareTo method, so we
//don't have to worry as much about edge cases.
return time1.compareTo(time2);
}
});
for (int i = 0; i < noteTimes.length; i++) {
RecordedNote note = new RecordedNote(noteTimes[i]);
System.out.println(note);
noteQueue.add(note);
}
System.out.println();
while (noteQueue.size() > 0) {
System.out.println(noteQueue.remove());
}
}
}
class RecordedNote {
private long time;
public RecordedNote(long time) {
this.time = time;
}
public long getTime() {
return time;
}
@Override
public String toString() {
return "[Time: " + time + "]";
}
}
所以这就引出了一个问题,为什么它不适合你呢?我自己,我没有在你的问题中看到足够的连贯代码来回答这个问题。我们不确定Song是什么,因为我没有看到它被声明为类或变量,而且我也看不到你在任何地方使用PriorityQueue变量,记录的位置。所以我建议你做同样的事情:创建一个小的可编译的可运行程序,我们可以运行和修改它,并证明你的问题,http://sscce.org
答案 1 :(得分:0)
我猜我有可能得到0.所以修改比较方法,使它返回一个正值而不是结果。
答案 2 :(得分:0)
阅读PriorityQueue的API文档,其中说明了以下内容:
方法iterator()中提供的迭代器不保证以任何特定顺序遍历优先级队列的元素。如果需要有序遍历,请考虑使用Arrays.sort(pq.toArray())。
我的猜测是remove()
没有义务遵循自然顺序。