如何使用此代码对相同的值进行排序?

时间:2016-08-26 12:15:25

标签: java sorting dictionary hashmap

此问题中的代码属于this回答。

我的问题是:如何使用以下代码对相同的值进行排序?

import java.util.*;

public class MapUtil
{
    public static <K, V extends Comparable<? super V>> Map<K, V> 
        sortByValue( Map<K, V> map )
    {
        List<Map.Entry<K, V>> list =
            new LinkedList<Map.Entry<K, V>>( map.entrySet() );
        Collections.sort( list, new Comparator<Map.Entry<K, V>>()
        {
            public int compare( Map.Entry<K, V> o1, Map.Entry<K, V> o2 )
            {
                return (o1.getValue()).compareTo( o2.getValue() );
            }
        } );

        Map<K, V> result = new LinkedHashMap<K, V>();
        for (Map.Entry<K, V> entry : list)
        {
            result.put( entry.getKey(), entry.getValue() );
        }
        return result;
    }
}

2 个答案:

答案 0 :(得分:4)

来自Collections.sort()REPLACE())的文档:

  

这种保证是稳定的:相同的元素不会因排序而重新排序。

因此,相等元素的顺序(即在这种情况下具有相等值的条目)将与map.entrySet()返回的原始条目集中的顺序相同。

答案 1 :(得分:2)

这个答案部分是对一些评论的回答。

首先,虽然原始海报Dake在同一输入中观察到相同的顺序,但一般来说,不同的Map实施(例如HashMapLinkedHashMapTreeMap )通常以不同的顺序分发其入口集的元素,这足以使原始海报的代码在包含相同映射的地图上给出不同的结果。

其次,我在评论中询问有关比较器的问题,以便根据添加到地图中的日期对相等值进行排序。通常,地图不会跟踪这样的日期,因此这是不可能的。但是,如果您使用LinkedHashMap作为原始地图,则会保留广告订单,这样就可以满足您的要求。

最后,为了完成,假设您希望通过键对具有相同值的条目进行排序:

public static <K extends Comparable<? super K>, V extends Comparable<? super V>> Map<K, V> sortByValue( Map<K, V> map )
{
    List<Map.Entry<K, V>> list = new ArrayList<Map.Entry<K, V>>( map.entrySet() );
    list.sort(Comparator.comparing(Map.Entry<K, V>::getValue).thenComparing(Map.Entry<K, V>::getKey) );

    Map<K, V> result = new LinkedHashMap<K, V>();
    for (Map.Entry<K, V> entry : list)
    {
        result.put( entry.getKey(), entry.getValue() );
    }
    return result;
}

这是Java 8的答案。您可以在早期的Java版本中使用更多代码行获得相同的内容。