排序映射键,值的价值
课程设计
1
我对Java比较陌生,经常发现我需要对一个
Map<Key, Value>
值进行排序。
由于这些值不是唯一的,我发现自己将 转换
keySet
为,并使用自定义比较器通过数组排序
array
对该数组进行排序对该数组进行排序,该比较器对与键关联的值进行排序。
有没有更简单的方法?
-
对键进行排序需要比较器为每次比较查找每个值。一个更具可扩展性的解决方案将直接使用 entrySet,从那时起,该值将立即可用于每次比较(尽管我没有通过数字支持这一点)。
这是此类事物的通用版本:
public static <K, V extends Comparable<? super V>> List<K> getKeysSortedByValue(Map<K, V> map) { final int size = map.size(); final List<Map.Entry<K, V>> list = new ArrayList<Map.Entry<K, V>>(size); list.addAll(map.entrySet()); final ValueComparator<V> cmp = new ValueComparator<V>(); Collections.sort(list, cmp); final List<K> keys = new ArrayList<K>(size); for (int i = 0; i < size; i++) { keys.set(i, list.get(i).getKey()); } return keys; } private static final class ValueComparator<V extends Comparable<? super V>> implements Comparator<Map.Entry<?, V>> { public int compare(Map.Entry<?, V> o1, Map.Entry<?, V> o2) { return o1.getValue().compareTo(o2.getValue()); } }
-
这是一个通用的友好版本:
public class MapUtil { public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) { List<Entry<K, V>> list = new ArrayList<>(map.entrySet()); list.sort(Entry.comparingByValue()); Map<K, V> result = new LinkedHashMap<>(); for (Entry<K, V> entry : list) { result.put(entry.getKey(), entry.getValue()); } return result; } }
发表回复