好的,这个问题可能会让您说“什么?”但请尝试提供一些背景信息。 我正在开发一个程序,该程序读取 plaintext 文件,然后根据该单词出现的次数按降序对文件中的字符串进行排序,然后对出现次数相同的单词进行排序,我必须按字母升序对这些单词进行排序...
现在,我有一个名为“单词”的数组列表,其中包含我打开的文本文件中的每个单词。那么,如果出现联系,我该如何按照出现的单词数的降序对它进行排序,然后按字母顺序升序排序呢?
所以,如果我有一个列表是:
[a, a, a, a, b, c, c, c, c, d, d, e, e, e, e, e]
排序后我的输出列表为:
e : 5
a : 4 // notice the words that occur 4 times are alphabetical sorted
c : 4
d : 2
b : 1
答案 0 :(得分:0)
根据您的问题。
按照单词出现的次数按降序对文件中的字符串进行排序,然后对于出现次数相同的单词,我必须按字母的升序对这些单词进行排序...
这意味着
首先,您需要获取单词的不同列表并计算每个单词的出现次数,这可以使用HashMap来实现。
第二,首先通过出现次数降序排列单词的唯一列表,然后通过字母升序排列,这可以通过实现Comparator并使用Collections.sort方法来实现。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class SortOccurrence {
Map<String, Integer> wordToOccurenceMap = new HashMap<String, Integer>();
SortOccurrence(List<String> words) {
// Count occurrence for each word
for (String word : words) {
if (!wordToOccurenceMap.containsKey(word)) {
wordToOccurenceMap.put(word, 0);
}
wordToOccurenceMap.put(word, wordToOccurenceMap.get(word) + 1);
}
}
List<String> getSortResult() {
List<String> distinctWords = new ArrayList<String>(wordToOccurenceMap.keySet());
Collections.sort(distinctWords, new OccurrenceComparator());
List<String> sortResult = new ArrayList<String>();
for (String distinctWord : distinctWords) {
sortResult.add(distinctWord + " : " + wordToOccurenceMap.get(distinctWord));
}
return sortResult;
}
public class OccurrenceComparator implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
if (!wordToOccurenceMap.containsKey(o1) || !wordToOccurenceMap.containsKey(o2)) {
throw new IllegalArgumentException("word not occur");
}
// if occurrence same, compare the string
if (wordToOccurenceMap.get(o1).compareTo(wordToOccurenceMap.get(o2)) == 0) {
return o1.compareTo(o2);
}
// compare by occurrence, '-' for descending
return -wordToOccurenceMap.get(o1).compareTo(wordToOccurenceMap.get(o2));
}
}
public static void main(String[] args) {
List<String> input = Arrays.asList(
new String[] { "a", "a", "a", "a", "b", "c", "c", "c", "c", "d", "d", "e", "e", "e", "e", "e" });
SortOccurrence sortOccurence = new SortOccurrence(input);
System.out.println(sortOccurence.getSortResult());
}
}