此问题中的代码属于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;
}
}
答案 0 :(得分:4)
来自Collections.sort()
(REPLACE()
)的文档:
这种保证是稳定的:相同的元素不会因排序而重新排序。
因此,相等元素的顺序(即在这种情况下具有相等值的条目)将与map.entrySet()
返回的原始条目集中的顺序相同。
答案 1 :(得分:2)
这个答案部分是对一些评论的回答。
首先,虽然原始海报Dake在同一输入中观察到相同的顺序,但一般来说,不同的Map
实施(例如HashMap
,LinkedHashMap
和TreeMap
)通常以不同的顺序分发其入口集的元素,这足以使原始海报的代码在包含相同映射的地图上给出不同的结果。
其次,我在评论中询问有关比较器的问题,以便根据添加到地图中的日期对相等值进行排序。通常,地图不会跟踪这样的日期,因此这是不可能的。但是,如果您使用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版本中使用更多代码行获得相同的内容。