[英]How to use Java Comparator to sort an ArrayList using two parameters?
I have used Java Comparator to sort an ArrayList of Word objects in descending order of Word frequency attribute. 我已经使用Java比较器按Word频率属性的降序对Word对象的ArrayList进行排序。 The Word objects are created by first using a hashmap to read the words from a .txt file and then convert the hashmap to an ArrayList of Word objects.
通过首先使用哈希图从.txt文件中读取单词,然后将哈希图转换为Word对象的ArrayList来创建Word对象。 I would like to then sort the words that have the same frequency by alphabetical order.
然后,我想按字母顺序对具有相同频率的单词进行排序。
while (reader.hasNext()) {
word = reader.next().toLowerCase();
word = word.substring(0, 1).toUpperCase() + word.substring(1);
word = word.replaceAll("[^a-zA-Z ]", "");
if (!word.contains("0") || !word.contains("1") || !word.contains("2") || !word.contains("3") || !word.contains("4") || !word.contains("5") || !word.contains("6") || !word.contains("7") || !word.contains("8") || !word.contains("9") || !word.contains("-") || !word.contains("_")) {
// This is equivalent to searching every word in the list via hashing (O(1))
if(!frequencyMap.containsKey(word)) {
frequencyMap.put(word, 1);
} else {
// We have already seen the word, increase frequency.
frequencyMap.put(word, frequencyMap.get(word) + 1);
}
}
counter++;
}
for(Map.Entry<String, Integer> entry : frequencyMap.entrySet()) {
Word word = new Word(entry.getKey());
word.frequency = entry.getValue();
wordList.add(word);
}
Collections.sort(wordList, Word.WordFrequency);
public class Word {
String value;
int frequency;
public Word(String v) {
value = v;
frequency = 1;
}
public String getValue() {
return value;
}
public int getFrequency() {
return frequency;
}
public static Comparator<Word> WordFrequency = new Comparator<Word>() {
public int compare(Word w1, Word w2) {
int w1Frequency = w1.getFrequency();
int w2Frequency = w2.getFrequency();
return w2Frequency-w1Frequency;
}
};
}
See the thenComparing
method, which allows you to supply a comparison key for when there are ties: 请参见
thenComparing
方法,该方法可让您在有关系时提供比较键:
// sort using 'd' will sort 1st alphabetically, then by length
// (this is a totally arbitrary example)
Comparator<String> c = String::compareTo;
Comparator<String> d = c.thenComparing(s -> s.length());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.