排序映射键,值的价值

毕设驿站 课程设计 1

我对Java比较陌生,经常发现我需要对一个 Map<Key, Value> 值进行排序。

由于这些值不是唯一的,我发现自己将 转换 keySet 为,并使用自定义比较器通过数组排序 array 对该数组进行排序对该数组进行排序,该比较器对与键关联的值进行排序。

有没有更简单的方法?

回复

共2条回复 我来回复
  • 毕设工坊
    这个人很懒,什么都没有留下~
    评论

    对键进行排序需要比较器为每次比较查找每个值。一个更具可扩展性的解决方案将直接使用 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());
        }
    }
    
    0条评论
  • 源码港湾
    这个人很懒,什么都没有留下~
    评论

    这是一个通用的友好版本:

    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;
        }
    }
    
    0条评论

发表回复

登录后才能评论