根据您的用例,我将创建另一个表示您的数据结构的类,该类由哈希图和列表组成,用于维护值的顺序。
更多详情请点击此处:
Sort a Map<Key, Value> by values (Java)
Sorting HashMap by values
http://www.coderanch.com/t/382750/java/java/Sorting-HashMap-values
您还可以扩展 ConcurrentHashMap 以覆盖 entrySet 和 keySet 方法,以按值的顺序返回条目/键。
public class OrderedValueHashMap<K,V extends Comparable<V>> extends ConcurrentHashMap<K, V> {
@Override
public Set<Map.Entry<K, V>> entrySet() {
Set<Map.Entry<K, V>> orderedValueEntrySet = new TreeSet<Map.Entry<K,V>>(new Comparator<Map.Entry<K,V>>() {
@Override
public int compare(java.util.Map.Entry<K, V> o1,
java.util.Map.Entry<K, V> o2) {
return o1.getValue().compareTo(o2.getValue());
}
});
orderedValueEntrySet.addAll(super.entrySet());
return orderedValueEntrySet;
}
@Override
public Set<K> keySet() {
Set<K> orderedKeySet = new LinkedHashSet<K>();
for(Map.Entry<K, V> e : entrySet()) {
orderedKeySet.add(e.getKey());
}
return orderedKeySet;
}
}
上述解决方案不是最佳的,如果您经常调用方法 keySet/entrySet,因为它会在每次调用时对条目进行排序。您可能希望缓存这些结果以避免在地图的内部状态未更改时重新计算。
上面的一个示例运行如下:
public static void main(String[] args) {
ConcurrentHashMap<String,Integer> map = new OrderedValueHashMap<String,Integer>();
map.put("a", 3);
map.put("b", 7);
map.put("c", 1);
map.put("q", 2);
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry);
}
for (String key : map.keySet()) {
System.out.println(key);
}
}
输出:
c=1
q=2
a=3
b=7
c
q
a
b