在 Java 中实施 CompareTo

Implement a CompareTo in Java

我有一个 class PersonQ

public class PersonQ {
    Queue <Person> queue;
    int Rows;

    public PersonQ(int r){
        queue = new PriorityQueue<Person>(); 
        Rows = r; 
    }

    //Also I have getters and setters and a method to fill randomly with Random
}

现在

public class Person implements Comparable <Person> {
    String name; 
    int id; 
    double salary; 
    int position;

    public Person(String pN, int pID, double pSal, int pPos) {
        this.name = pN; 
        this.id = pID; 
        this.salary= pSal; 
        position=pPos;
    }

//Also I have getters and setters 

    @Override
    public int compareTo(Person other) {
        /*There I don't know how to make my statements because at the moment when I remove an element 
        it sorts wrong; Look, when I add 5 elements randomly it gets its proper position: 1, 2, 3, 4 
        and the last 5 when I use the method poll() it removes the element with position 1 but the 
        next step is that it sorts in a weird way, for example sometimes it starts with the element 
        with position 5, 4, 2 or 3 it occurs randomly and I want to see it in their proper order by its position */
    }
}

我想在删除一个元素后按此顺序显示我的队列,如果我删除一个位置为 1 的元素,则其余元素必须如下所示:2,3,4,5,如果我删除另一个它必须出现:3,4,5 等等。我尝试使用“Integer.compare(this.position, other.position);” 并且是一样的

信息不足,无法确定,但我猜您正在使用 PriorityQueue.iterator() 方法返回的 Iterator 来验证队列的顺序。

现在,该方法的 JavaDoc 明确指出(强调我的):

Returns an iterator over the elements in this queue. The iterator does not return the elements in any particular order.

要使用 java.util.PriorityQueue,您的 class 需要实现 Comparable 或在创建 PriorityQueue 的实例时指定 Comparator。队列中的元素将从低值到高值排序,元素将通过Comparator.compareComparable.compareTo方法进行评估。

在你的情况下,你的 class Person 实现 Comparable<Person>,你必须确定 Person 的顺序。此实现将使元素按 position:

排序
@Override
public int compareTo(Person other) {
    return position - other.position;
}

当你使用PriorityQueue.poll()时,它会给你最小值的元素。

注意java.util.PriorityQueue及其迭代器实现了CollectionIterator接口的所有可选方法。方法 iterator() 中提供的 Iterator 不保证以任何特定顺序遍历优先级队列的元素。如果您需要有序遍历,请考虑使用 Arrays.sort(pq.toArray())(来自 Java doc)