Java中优先级队列中重复元素的处理
为了实现哈夫曼的编码,我使用了一个优先级队列来模拟一个最小堆。我发现的问题是,每当一个重复的元素进入堆时,它就位于这些重复元素之上,就在下一个较小的元素之前。我需要的是能够把这个重复的元素放在重复的末尾,只要它找到一个相等的元素(在最后一个较大的元素之后) 例如: 如果我有Java中优先级队列中重复元素的处理,java,Java,为了实现哈夫曼的编码,我使用了一个优先级队列来模拟一个最小堆。我发现的问题是,每当一个重复的元素进入堆时,它就位于这些重复元素之上,就在下一个较小的元素之前。我需要的是能够把这个重复的元素放在重复的末尾,只要它找到一个相等的元素(在最后一个较大的元素之后) 例如: 如果我有 [1,2,2,3,4,5,6,7] 我想输入另一个2,让我们标记它2*,这是我得到的: [1,2*,2,2,3,4,5,6,7] 这就是我需要的: [1,2,2,2*,3,4,5,6,7] 有什么方法可以改变比较器来
[1,2,2,3,4,5,6,7]
我想输入另一个2,让我们标记它2*,这是我得到的:
[1,2*,2,2,3,4,5,6,7]
这就是我需要的:
[1,2,2,2*,3,4,5,6,7]
有什么方法可以改变比较器来实现这一点吗?或任何其他解决方案?来自
如果多个元素以最小值绑定,则头部就是这些元素之一——绑定被任意断开
因此,Java的PriorityQueue
对相同的值进行任意排序。除非扩展PriorityQueue
或AbstractQueue
以创建自己的优先级队列,否则它是不可自定义的
您可以使用一个简单的pair类来包含您的值和插入计数器,其中插入计数器可以是队列的一个成员,也可以是一个静态变量,每当插入发生时,该变量就会增加,并提供一个
比较器
或实现先比较值的Comparable
,如果值相等,则插入计数器将处于第二位。虽然没有默认的Comparator或Comparable with PriorityQueue实现,但您可以根据需要进行自定义
1.创建自己的比较器
class NumberComparator implements Comparator<Pair<Integer, ZonedDateTime>> {
public int compare(Pair<Integer, ZonedDateTime> s1, Pair<Integer, ZonedDateTime> s2) {
if (s1.getKey() < s2.getKey())
return 1;
else if (s1.getKey() > s2.getKey())
return -1;
else if (s1.getKey() == s2.getKey()) {
return s1.getValue().isAfter(s2.getValue()) ? -1 : 1;
}
return 0;
}}
classnumbercomparator实现比较器{
公共整数比较(对s1,对s2){
if(s1.getKey()s2.getKey())
返回-1;
else if(s1.getKey()==s2.getKey()){
返回s1.getValue().isAfter(s2.getValue())?-1:1;
}
返回0;
}}
2.在创建PriorityQueue时传递它
class Example {
public static void main(String[] args) {
PriorityQueue<Pair<Integer,ZonedDateTime>> pq = new
PriorityQueue<>(5, new NumberComparator());
pq.offer(new Pair(1,ZonedDateTime.now()));
pq.offer(new Pair(1,ZonedDateTime.now()));
pq.offer(new Pair(2,ZonedDateTime.now()));
pq.offer(new Pair(2,ZonedDateTime.now()));
pq.offer(new Pair(1,ZonedDateTime.now()));
while (!pq.isEmpty()) {
Pair<Integer, ZonedDateTime> pair = pq.poll();
System.out.println(pair.getKey()+"-"+pair.getValue().getNano());
}
}
类示例{
公共静态void main(字符串[]args){
优先级队列pq=新建
优先级队列(5,新的NumberComparator());
pq.报价(新的一对(1,ZoneDateTime.now());
pq.报价(新的一对(1,ZoneDateTime.now());
pq.报价(新的一对(2,ZoneDateTime.now());
pq.报价(新的一对(2,ZoneDateTime.now());
pq.报价(新的一对(1,ZoneDateTime.now());
而(!pq.isEmpty()){
Pair Pair=pq.poll();
System.out.println(pair.getKey()+“-”+pair.getValue().getNano());
}
}
}