使用PriorityQueue

时间:2016-09-06 15:05:05

标签: java queue priority-queue compareto

我正在尝试编写一个程序,我使用优先级队列复制注册商的办公室。此优先级队列的排序将基于首先提供的更高GPA等。我已经构建了一个程序,使用我自己的实现来执行此操作,但我很困惑如何实现我的compareTo方法。

//Create Priority Queue
PriorityQueue<Student> pQueue = new PriorityQueue<Student>(10, compareTo());

首先我制作了优先队列。根据文档,我可以指定我用于比较的内容,compareTo()。

但是当我尝试实现compareTo方法时,它不允许我提供任何参数。

private Comparator<? super Student> compareTo(Student x, Student y) {
}

它告诉我&buntarOfficeJavaService中的compareTo无法应用于()&#39;我的IDE提供删除我的参数。但我不明白如何在没有对象比较的情况下进行比较?

我在类中唯一的另一个方法是recieveEvent,它基本上只是确定我是从队列中删除还是添加到队列中。该活动下的数据是我可以比较的学生对象,但我根本不理解如何把它们放在一起。

    public void receiveEvent(Event<Student> event) {
    if (event.getType() == EventType.REQUEST_COMPLETED){
        pQueue.poll();
    }

    else{


    }
}

在一些帮助下,我提出了这种比较方法。但是,当新学生首先在列表中对照学生进行检查时,问题仍然存在,并且他们的GPA不高,它会将该学生附加到列表的末尾而不检查pQueue中的其他学生。

PriorityQueue<Student> pQueue = new PriorityQueue<Student>(10, new Comparator<Student>(){
    @Override
    public int compare(Student o1, Student o2){
        if (o1.equals(o2))
            return 0;
        else if(o1.getGpa() > o2.getGpa())
            return -1;
        else
            return 1;
    }

});

private boolean equals (Student o1, Student o2){
    if (o1.getGpa() == o2.getGpa())
        return true;
    else
        return false;
}

2 个答案:

答案 0 :(得分:0)

创建实现Comparator Inteface的新类,并将此类实例传递给优先级队列。

如果您的GPA是Class / Reference Type :(例如Integer,Double,Float),您可以使用以下代码:

PriorityQueue<Student> pQueue = new PriorityQueue<Student>(10, new Comparator<Student> {

    @Override
    public int compare(Student arg0, Student arg1) {
        // TODO Auto-generated method stub
        return arg0.getGPA().compareTo(arg1.getGPA());
    }
});

如果你的GPA是原始类型:(例如int,double,float)你可以使用以下代码:

@Override
    public int compare(Student arg0, Student arg1) {
        // TODO Auto-generated method stub
        return Integer.compare(arg0.getGPA(),arg1.getGPA());
    }

注意:根据您的数据类型替换整数。

compareTo()不一定仅返回-1,0或1. compareTo()两个对象的返回0相等,如果obj1 <0,则值小于零。如果obj1> 0,则obj2和大于零的值obj2的。 此方法是内联比较器声明。

答案 1 :(得分:0)

第二个参数需要一个Comparator对象,而不是对compareTo方法的直接调用:

//Create Priority Queue
PriorityQueue<Student> pQueue = new PriorityQueue<Student>(10, new Comparator<Student>() {

        @Override
        public int compare(Student o1, Student o2) {
            // your logic
        }
    });

&#34;比较(T o1,T o2)&#34; -Method是该Comparator对象的一部分,必须在一个对象中定义。