Там может быть несколько решений, вот мое. создать class
с двумя полями; один для String
и один для Integer
. Заставьте класс реализовать Comparable
и переопределить метод compareTo
, чтобы он сравнивал Integers
.
public class WordFrequency implements Comparable<WordFrequency> {
private String word;
private Integer frequency;
public WordFrequency(String word, Integer frequency) {
this.word = word;
this.frequency = frequency;
}
// descending order
@Override
public int compareTo(WordFrequency o) {
return o.getFrequency() - this.getFrequency();
}
public Integer getFrequency() {
return this.frequency;
}
@Override
public String toString() {
return word + ": " + frequency;
}
}
Затем конвертируйте map<String, Integer>
в PriorityQueue<WordFrequency>
:
PriorityQueue<WordFrequency> pQueue = frequency.entrySet().stream()
.map(m -> new WordFrequency(m.getKey(), m.getValue()))
.collect(Collectors.toCollection(PriorityQueue::new));
Если вы хотите распечатать его, вы должны использовать poll()
, в противном случае порядок не гарантируется.
while(!pQueue.isEmpty())
System.out.println(pQueue.poll());