PriorityQueue 排序但最大的两个
PriorityQueue sorted but the two biggest
public class Pair implements Comparable<Pair>{
public String name;
public int number;
public int compareTo(Pair other) {
if (other == null) {
return 1;
}
return Integer.compare(number, other.number);
}
}
ht = new Hashtable<String, Pair>(perLen);
PriorityQueue<Pair> pq = new PriorityQueue<Pair>(k);
set = ht.keySet();
for (String i: set) {
tmp0 = ht.get(i);
if (tmp0.compareTo(pq.peek()) > 0) {
if (pq.size() == k) {
pq.remove();
}
pq.add(tmp0);
}
}
System.out.println(pq.toString());
输出:
[OSCAR 822, ALBERTO 827, DAVID 1523, JAVIER 943]
我正在哈希表中寻找最大的 k 对(它们的编号),而输出中的那些实际上是正确的。我的问题是,为什么最后两个交换了?
您可以使用 poll 方法检查顺序,如下所示:
Print content of priority queue[java]
PriorityQueue 的 toString() 方法 class 不能保证元素的顺序,因为它使用迭代器。
PriorityQueue
仅 returns 从其头部算起的最低元素。它不会对所有元素进行排序,因此如果您使用 pq.toString()
遍历队列,元素可能不会按顺序出现。发生这种情况是因为在内部,PriorityQueue.toString()
使用 PriorityQueue.iterator()
方法,并且根据文档:
The Iterator provided in method iterator()
is not guaranteed to traverse the elements of the priority queue in any particular order. If you need ordered traversal, consider using Arrays.sort(pq.toArray())
.
如果你想按顺序打印优先队列的元素,你应该更改此代码:
System.out.println(pq.toString());
以下内容:
while (!pq.isEmpty())
System.out.println(pq.remove());
public class Pair implements Comparable<Pair>{
public String name;
public int number;
public int compareTo(Pair other) {
if (other == null) {
return 1;
}
return Integer.compare(number, other.number);
}
}
ht = new Hashtable<String, Pair>(perLen);
PriorityQueue<Pair> pq = new PriorityQueue<Pair>(k);
set = ht.keySet();
for (String i: set) {
tmp0 = ht.get(i);
if (tmp0.compareTo(pq.peek()) > 0) {
if (pq.size() == k) {
pq.remove();
}
pq.add(tmp0);
}
}
System.out.println(pq.toString());
输出:
[OSCAR 822, ALBERTO 827, DAVID 1523, JAVIER 943]
我正在哈希表中寻找最大的 k 对(它们的编号),而输出中的那些实际上是正确的。我的问题是,为什么最后两个交换了?
您可以使用 poll 方法检查顺序,如下所示:
Print content of priority queue[java]
PriorityQueue 的 toString() 方法 class 不能保证元素的顺序,因为它使用迭代器。
PriorityQueue
仅 returns 从其头部算起的最低元素。它不会对所有元素进行排序,因此如果您使用 pq.toString()
遍历队列,元素可能不会按顺序出现。发生这种情况是因为在内部,PriorityQueue.toString()
使用 PriorityQueue.iterator()
方法,并且根据文档:
The Iterator provided in method
iterator()
is not guaranteed to traverse the elements of the priority queue in any particular order. If you need ordered traversal, consider usingArrays.sort(pq.toArray())
.
如果你想按顺序打印优先队列的元素,你应该更改此代码:
System.out.println(pq.toString());
以下内容:
while (!pq.isEmpty())
System.out.println(pq.remove());