Java,如何在比较器中按字母顺序对字符进行排序

标签 java comparator

我正在尝试构建最大字符堆。首先按频率排序,如果频率相同,则按字母顺序排序。

Map<Character, Integer> map = new HashMap<>();
for(int i = 0; i < n; i++) {
     char c = s.charAt(i);
     map.put(c, map.getOrDefault(c, 0) + 1);
}

Queue<Character> pq = new PriorityQueue<>(new Comparator<Character>(){
  @Override
  public int compare(Character c1, Character c2){
   if(map.get(c1) == map.get(c2)){
     return c1 < c2 ? -1 : (c1 == c2 ? 0 : 1);
     //return (char)c1 - (char)c2; same output
   }
   return map.get(c2) - map.get(c1);
  }
});

for(char key : map.keySet()){
   pq.offer(key);
   System.out.println(key + " has freq " + map.get(key));
}

while(!pq.isEmpty()) {
     System.out.print(pq.poll() + " ");
}   

我将26个字母放入这个maxheap中,每个字母的频率相同5000。

但输出顺序是 'a', 'z', 'y', 'x'......, 'c', 'b'。
enter image description here

当每个字符出现的频率为5时,顺序正确。 enter image description here

我不明白为什么频率5000的输出是这样的。我怎样才能得到正确的订单?

最佳答案

鉴于所有频率都相同,您的 if 语句是错误的。您可以使用内置方法来比较对象并返回结果

Integer f1 = map.get(c1);
Integer f2 = map.get(c2);
int x = f1.compareTo(f2)
if(x == 0){
    return Character.compare(c1, c2);
}
return x;

关于Java,如何在比较器中按字母顺序对字符进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58072204/

相关文章:

java - 结构内部的 JNA 结构

java - javax.swing 是否可以在一帧中使用两个画家?

Java 8 : Idiomatically creating a Comparator for ordering objects based on their index in a List

C++ lambda 函数 - 如何返回与目标相比最近的 vector 元素

java - 如何对 Map<String, List<Summary>> 进行排序

java - 通过 ObjectOutputStream 发送相同但已修改的对象

java - 在 java 中将 html 转换为 doc

java - 当我们使用 super 时,为什么 Java 8::operator 不能用于 Object hashcode 方法?

java - ImmutableSortedMap - 映射中的重复键

java - 按特定字符排序列表(Java 8)