HashMaps 不支持对元素进行排序,因此您必须首先将数据复制到允许排序的数据结构中:
ArrayList<Map.Entry<List<String>, HashMap<List<String>, Long>> items =
new ArrayList<>(frequencyMap.entrySet());
现在,写一个比较 Map.Entry 值的 Comparator:
class FrequencyComparator
implements Comparator<Map.Entry<List<String>, HashMap<List<String>, Long>> {
public int compare(Map.Entry<List<String>, HashMap<List<String>, Long>> a,
Map.Entry<List<String>, HashMap<List<String>, Long>> b) {
// code to get a's and b's frequency counts and compare them
}
}
现在,您可以对数组进行排序:
Collections.sort(items, new FrequencyComparator());
如果获取项目的频率计数很昂贵,那么您可以为每个项目计算一次,然后对包含这些预先计算值的数据结构进行排序:
class FrequencySortHelper implements Comparable<FrequencySortHelper> {
final List<String> key;
final int score;
public FrequencySortHelper(List<String> key, HashMap<List<String>, Long>> value) {
this.key = key;
score = getFrequencyCount(value);
}
public int compareTo(FrequencySortHelper other) {
int thisVal = this.score;
int anotherVal = other.score;
return (thisVal<anotherVal ? -1 : (thisVal==anotherVal ? 0 : 1));
}
}
ArrayList<FrequencySortHelper> items = new ArrayList<>(frequencyMap.size());
for (Map.Entry<List<String>, HashMap<List<String>, Long>> item : frequencyMap.entrySet()) {
items.add(new FrequencySortHelper(item.key(), item.value()));
}
Collections.sort(items); // Uses FrequencySortHelper's compareTo()
如果您认为Map.Entry<List<String>, HashMap<List<String>, Long>> 的所有这些东西都很尴尬,那么您是对的。您应该考虑定义一些对象来包含这些数据,而不是仅仅将集合串在一起。