在 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.compare
或Comparable.compareTo
方法进行评估。
在你的情况下,你的 class Person
实现 Comparable<Person>
,你必须确定 Person
的顺序。此实现将使元素按 position
:
排序
@Override
public int compareTo(Person other) {
return position - other.position;
}
当你使用PriorityQueue.poll()
时,它会给你最小值的元素。
注意:java.util.PriorityQueue
及其迭代器实现了Collection
和Iterator
接口的所有可选方法。方法 iterator()
中提供的 Iterator
不保证以任何特定顺序遍历优先级队列的元素。如果您需要有序遍历,请考虑使用 Arrays.sort(pq.toArray())
(来自 Java doc)
我有一个 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.compare
或Comparable.compareTo
方法进行评估。
在你的情况下,你的 class Person
实现 Comparable<Person>
,你必须确定 Person
的顺序。此实现将使元素按 position
:
@Override
public int compareTo(Person other) {
return position - other.position;
}
当你使用PriorityQueue.poll()
时,它会给你最小值的元素。
注意:java.util.PriorityQueue
及其迭代器实现了Collection
和Iterator
接口的所有可选方法。方法 iterator()
中提供的 Iterator
不保证以任何特定顺序遍历优先级队列的元素。如果您需要有序遍历,请考虑使用 Arrays.sort(pq.toArray())
(来自 Java doc)