【发布时间】:2025-12-12 11:35:01
【问题描述】:
我很困惑。 Offer() 按字母顺序填充列表,并且它也优先考虑大写单词。如何按我输入的顺序填充列表?
import java.util.*;
public class Bucky {
public static void main(String[] args) {
PriorityQueue<String> q= new PriorityQueue<String>();
q.offer("first");
q.offer("aecond");
q.offer("zhird");
System.out.printf("%s ",q);
System.out.println();
System.out.printf("%s ", q.peek());
System.out.println();
}
}
o/p= [aecond,第一,zhird] 第二个
import java.util.*;
public class Bucky {
public static void main(String[] args) {
PriorityQueue<String> q= new PriorityQueue<String>();
q.offer("first");
q.offer("aecond");
q.offer("Zhird");
System.out.printf("%s ",q);
System.out.println();
System.out.printf("%s ", q.peek());
System.out.println();
}
}
o/p= [Zhird,第一,第二] 日德
【问题讨论】:
-
它是基于
String#compareTo排序的,它“按字典顺序比较两个字符串”(基于 unicode 值)。您必须传入自己的比较器才能更改排序。 -
我明白为什么大写优先,但我对
first和aecond之间的重新排序感到困惑。 -
@shmosel 那是因为
iterator()不会以任何特定顺序遍历元素。来自docs:方法 iterator() 中提供的迭代器不能保证以任何特定顺序遍历优先级队列的元素。如果您需要有序遍历,请考虑使用 Arrays.sort(pq.toArray()) -
@FedericoPeraltaSchaffner:多么令人困惑的文档说明。迭代器实际上确实保证了遍历顺序:项目出现在底层数组中的顺序。注释的真正含义是迭代器不能保证按优先级顺序遍历项目。这是因为任何包含两个以上元素的二进制堆都有多个有效的数组表示。
-
@JimMischel 我已经阅读了您的答案,我觉得它很棒。我认为它解释了为什么不能保证订单。我会尽快投票(今天票数用完了)。我认为文档说明清楚地表明不能保证顺序,甚至说不能保证以任何特定顺序遍历元素。它没有提到优先级。如果遍历顺序是特定于实现的,则无法保证。事实是,优先级队列并不打算用作对其元素施加顺序的结构,除了第一个。
标签: java data-structures queue