我的优先级队列有问题,无法正确排序对象值。
我的代码获取一个文本字符串,并获取唯一字符的数量,同时计算每个唯一字符的频率。然后将其放入字符和整数类型的映射中,并分别指定键和值。
然后,它获取映射的每个条目,并将其放入一个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时,顺序并不重要,但最后两个元素的顺序是错误的。有什么想法吗?
PriorityQueue
不保证它会被排序PriorityQueue
保证从poll
和peek
接收的下一个项目最少。如果你想让你的项目井然有序,你必须逐个轮询
它们,而不是按原样打印优先队列
。
如果您正在寻找一个将被排序的结构,TreeSet
可能更好,或者可能是一个普通的旧ArrayList
,您可以在插入所有元素后显式地排序
。
我所拥有的是一个类,它创建了一个具有优先级、到达时间和完成时间的对象。我还有许多优先级队列可以将它们放入其中。当我开始时,我将它们放入到达队列中,对它们进行排序,然后查看哪个第一个进入,并将其放入队列中。但是,当我尝试向到达队列添加第二个队列时,它会失败并抛出一个异常。我首先要做的是将所有进程添加到到达队列中,然后对它们进行排序,这样到达时间最短的进程将是到达队列中第一个进入队列的进程。谢谢你帮忙
按学生成绩的先后顺序,按“不及格”、“及格”、“不可用”(不按字母顺序)排序,成绩不及格的学生应排在名单的首位。然后是“通过”,然后是“不可用” 如果多个学生的结果相同,则按卷号升序排序。 最终结果应该如下所示。
我有一个,名为,其中包含类型的对象。 您可以在所有车辆上调用该方法。 我要做的是排序,这样车辆被赋予更高的优先级,并被放在队列的前面。 我假设我必须在这里使用一个比较器,但不知道怎么做。
我试图在O(mlogn)时间内对Dijkstra算法进行编码,其中m是边数,n是节点数。我用它来查找给定起始节点和给定结束节点之间的最短路径。我对这个很陌生。 假设图由邻接矩阵表示,每个节点都有一个行索引。 这是O(mlogn),因为每个边只更新一次距离。 “初始化堆需要线性时间,然后执行m次更新,每次更新的代价为O(log n),总时间为O(mlog n)。”-http://www.cs.cmu