您的位置:首页 > 产品设计 > UI/UE

Sort a Map<Key, Value> by values (Java) HashMap按value值排序

2016-07-12 17:35 716 查看
<span style="font-size:18px;">  对HashMap按value值的大小进行排序,方法如下。</span>
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;
}
}
And an associated JUnit4 test so you don't have to take my word for it:import java.util.*;import org.junit.*;public class MapUtilTest{@Testpublic void testSortByValue(){Random random = new Random(System.currentTimeMillis());Map<String, Integer> testMap = new HashMap<String, Integer>(1000);for(int i = 0 ; i < 1000 ; ++i) {testMap.put( "SomeString" + random.nextInt(), random.nextInt());}testMap = MapUtil.sortByValue( testMap );Assert.assertEquals( 1000, testMap.size() );Integer previous = null;for(Map.Entry<String, Integer> entry : testMap.entrySet()) {Assert.assertNotNull( entry.getValue() );if (previous != null) {Assert.assertTrue( entry.getValue() >= previous );}previous = entry.getValue();}}}Java7 Version: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.entrySet() );Collections.sort( list, new Comparator<Map.Entry<K, V>>(){@Overridepublic int compare( Map.Entry<K, V> o1, Map.Entry<K, V> o2 ){return ( o1.getValue() ).compareTo( o2.getValue() );}} );Map<K, V> result = new LinkedHashMap<>();for (Map.Entry<K, V> entry : list){result.put( entry.getKey(), entry.getValue() );}return result;}Java8 Version:public static <K, V extends Comparable<? super V>> Map<K, V>sortByValue( Map<K, V> map ){Map<K, V> result = new LinkedHashMap<>();Stream<Map.Entry<K, V>> st = map.entrySet().stream();st.sorted( Map.Entry.comparingByValue() ).forEachOrdered( e -> result.put(e.getKey(), e.getValue()) );return result;}在JAVA8版本中,st.sorted(Map.Entry.comparingByValue()).forEachOrdered(e->result.put(e.getKey(), e.getValue()));也可写成:st.sorted(Comparator.comparing(e -> e.getValue())).forEach(e -> result.put(e.getKey(), e.getValue()));
以上是按照升序排序的,按照降序排序方法如下:import java.util.*;import java.util.stream.Stream;public class MapUtil {public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue( Map<K, V> map) {Map<K, V> result = new LinkedHashMap<>();Stream<Map.Entry<K, V>> st = map.entrySet().stream();Comparator ok = new Comparator<Map.Entry<K, V>>(){public int compare( Map.Entry<K, V> o1, Map.Entry<K, V> o2 ){return (o2.getValue()).compareTo( o1.getValue() );}};st.sorted(ok).forEachOrdered(e->result.put(e.getKey(), e.getValue()));return result;}}
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hashmap 排序