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;}}
相关文章推荐
- 在命令行用 sort 进行排序
- c语言实现hashmap(转载)
- 文件遍历排序函数
- 关于C#中排序函数的总结
- C#选择排序法实例分析
- C#插入法排序算法实例分析
- C#实现Datatable排序的方法
- MYSQL必知必会读书笔记第五章之排序检索数据
- SQLSERVER的排序问题结果不是想要的
- Ruby实现插入排序算法及进阶的二路插入排序代码示例
- Windows Powershell排序和分组管道结果
- C#通过IComparable实现ListT.sort()排序
- C#选择法排序实例分析
- SQL学习笔记四 聚合函数、排序方法
- C#对list列表进行随机排序的方法
- jQuery拖动元素并对元素进行重新排序
- 将MySQL查询结果按值排序的简要教程
- 深入解析桶排序算法及Node.js上JavaScript的代码实现
- 经典排序算法之冒泡排序(Bubble sort)代码
- 一根网线内的8根线哪4根是传输数据的,哪四根是防干扰的