Java, как отсортировать символы в алфавитном порядке в Comparator - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь создать maxheap символов.Сначала сортируйте по частоте, если частота одинакова, затем сортируйте в алфавитном порядке.

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

при частоте каждогоchar 5, порядок правильный.enter image description here

Я не понимаю, почему выход с частотой 5000 такой.Как я могу получить правильный заказ?

Ответы [ 2 ]

3 голосов
/ 24 сентября 2019

Учитывая, что все частоты одинаковы, ваше утверждение 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;
0 голосов
/ 24 сентября 2019

Вы можете сравнить два объекта с помощью метода .equals ().он вернет логическое значение.если вы хотите выполнить жесткое сравнение кода, тогда присвойте целочисленное значение каждому алфавиту (всего 26 переменных) и сравните их целочисленное значение, и вы будете знать, какое из них разместить где.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...