优先级队列问题

时间:2011-02-08 03:51:52

标签: java priority-queue

我正在尝试在我的代码中使用优先级队列,并且出于某种原因,当我删除对象时,它们不是有序的。你知道我做错了什么吗? 这是我的代码:

构造函数:

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这样的订单。

你能看出我的构造函数是否有问题吗?

谢谢!

3 个答案:

答案 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()没有义务遵循自然顺序。