当前位置: 首页 > 知识库问答 >
问题:

使用从Map生成的对象(值)对优先级队列进行排序

单于海荣
2023-03-14

我的优先级队列有问题,无法正确排序对象值。

我的代码获取一个文本字符串,并获取唯一字符的数量,同时计算每个唯一字符的频率。然后将其放入字符和整数类型的映射中,并分别指定键和值。

然后,它获取映射的每个条目,并将其放入一个PQNode对象中,该对象也是Character、Integer类型,然后将其提供给优先级队列。

优先级队列是通过PQN中的comareTo方法按频率(值)从最低到最高对PQNodes进行排序ode.java

我试着在网上搜索,并试图放入一个列表来排序,但没有运气。

public class Counting { 
public Counting(String text) {
    text = "mississippi river";
    Queue<PQNode> fringe = new PriorityQueue<>(); 
    char[] letters = text.toCharArray(); 
    Map<Character, Integer> frequency = new HashMap<>(); 

    for(char letter : letters) {
        if(frequency.containsKey(letter)) { 
            frequency.put(letter, frequency.get(letter) + 1);
        }
        else {frequency.put(letter, 1);} 
        }

    for(Map.Entry<Character, Integer> element : frequency.entrySet()) {
        PQNode pqN = new PQNode(element.getKey(), element.getValue());
        fringe.offer(pqN); 
    }
    System.out.println(fringe);
    }
}
public class PQNode implements Comparable<PQNode>{
    Character c;
    int freq;

    public PQNode(Character c, int freq) {
        this.c = c;
        this.freq = freq;
    }

    public String toString() {
        return "[c=" + c + ", freq=" + freq + "]";
    }

    public int compareTo(PQNode otherFreq) {
        return Integer.compare(this.freq, otherFreq.freq);
    }
}

预期输出为:[[c=,freq=1],[c=e,freq=1],[c=v,freq=1],[c=m,freq=1],[c=p,freq=2],[c=r,freq=2],[c=s,freq=4],[c=i,freq=5]]

但实际输出是:[[c=,freq=1],[c=e,freq=1],[c=v,freq=1],[c=m,freq=1],[c=p,freq=2],[c=r,freq=2],[c=i,freq=5],[c=s,freq=4]]

当频率等于1时,顺序并不重要,但最后两个元素的顺序是错误的。有什么想法吗?

共有1个答案

殷耀
2023-03-14

PriorityQueue不保证它会被排序PriorityQueue保证从pollpeek接收的下一个项目最少。如果你想让你的项目井然有序,你必须逐个轮询它们,而不是按原样打印优先队列

如果您正在寻找一个将被排序的结构,TreeSet可能更好,或者可能是一个普通的旧ArrayList,您可以在插入所有元素后显式地排序

 类似资料:
  • 我所拥有的是一个类,它创建了一个具有优先级、到达时间和完成时间的对象。我还有许多优先级队列可以将它们放入其中。当我开始时,我将它们放入到达队列中,对它们进行排序,然后查看哪个第一个进入,并将其放入队列中。但是,当我尝试向到达队列添加第二个队列时,它会失败并抛出一个异常。我首先要做的是将所有进程添加到到达队列中,然后对它们进行排序,这样到达时间最短的进程将是到达队列中第一个进入队列的进程。谢谢你帮忙

  • 按学生成绩的先后顺序,按“不及格”、“及格”、“不可用”(不按字母顺序)排序,成绩不及格的学生应排在名单的首位。然后是“通过”,然后是“不可用” 如果多个学生的结果相同,则按卷号升序排序。 最终结果应该如下所示。

  • 我有一个,名为,其中包含类型的对象。 您可以在所有车辆上调用该方法。 我要做的是排序,这样车辆被赋予更高的优先级,并被放在队列的前面。 我假设我必须在这里使用一个比较器,但不知道怎么做。

  • 我试图在O(mlogn)时间内对Dijkstra算法进行编码,其中m是边数,n是节点数。我用它来查找给定起始节点和给定结束节点之间的最短路径。我对这个很陌生。 假设图由邻接矩阵表示,每个节点都有一个行索引。 这是O(mlogn),因为每个边只更新一次距离。 “初始化堆需要线性时间,然后执行m次更新,每次更新的代价为O(log n),总时间为O(mlog n)。”-http://www.cs.cmu