Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中优先级队列中重复元素的处理_Java - Fatal编程技术网

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());
}
}
}