如何使用 Java Comparator 使用两个参数对 ArrayList 进行排序?
How to use Java Comparator to sort an ArrayList using two parameters?
我已使用 Java 比较器按词频属性的降序对 Word 对象的 ArrayList 进行排序。创建 Word 对象的方法是首先使用散列图从 .txt 文件中读取单词,然后将散列图转换为 Word 对象的 ArrayList。然后我想按字母顺序对频率相同的单词进行排序。
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;
}
};
}
请参阅 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());
我已使用 Java 比较器按词频属性的降序对 Word 对象的 ArrayList 进行排序。创建 Word 对象的方法是首先使用散列图从 .txt 文件中读取单词,然后将散列图转换为 Word 对象的 ArrayList。然后我想按字母顺序对频率相同的单词进行排序。
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;
}
};
}
请参阅 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());