好问题
Good  Question
  • 首 页
  • 问题
    • PHP
    • JAVA
    • CPlusPlus
    • C#
    • SQL
  • 关 于
  • 联 系
在Java中通过Value对Map进行排序 关闭 返回上一级  

在Java中通过Value对Map<Key , Value>进行排序
+ 查看更多

发布日期:2018-03-10 14:00
分类:JAVA
浏览次数:104
在Java中通过Value对Map<Key , Value>进行排序
我是一个Java初学者。我经常需要按照 Value 对 Map<Key, Value> 排序。
由于 Value 是不唯一的,所以我会首先把 keySet 转换成 array 。然后在 Arrays.sort 中使用自定义的 Comparator 接口函数,根据与Key 有关的 Value 对该 array 进行排序。
有更简单的方法吗?

回答

import java.util.*;

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

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

这是一个相关联的JUnit4 测试:
import java.util.*;
import org.junit.*;

public class MapUtilTest
{
    @Test
    public void testSortByValue()
    {
        Random random = new Random(System.currentTimeMillis());
        Map testMap = new HashMap(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 entry : testMap.entrySet()) {
            Assert.assertNotNull( entry.getValue() );
            if (previous != null) {
                Assert.assertTrue( entry.getValue() >= previous );
            }
            previous = entry.getValue();
        }
    }

}

Java 7 版本:
public static > Map 
    sortByValue( Map map )
{
    List> list =
        new LinkedList<>( map.entrySet() );
    Collections.sort( list, new Comparator>()
    {
        @Override
        public int compare( Map.Entry o1, Map.Entry o2 )
        {
            return ( o1.getValue() ).compareTo( o2.getValue() );
        }
    } );

    Map result = new LinkedHashMap<>();
    for (Map.Entry entry : list)
    {
        result.put( entry.getKey(), entry.getValue() );
    }
    return result;
}
Java 8 版本:
这将按 Value 升序排列。如果需要降序,只要取消对Collections.reverseOrder() 调用的注释。
public static > Map sortByValue(Map map) {
    return map.entrySet()
              .stream()
              .sorted(Map.Entry.comparingByValue(/*Collections.reverseOrder()*/))
              .collect(Collectors.toMap(
                Map.Entry::getKey, 
                Map.Entry::getValue, 
                (e1, e2) -> e1, 
                LinkedHashMap::new
              ));
}
上一篇比较Java中的枚举值时,是需要使用“==”还是“equals()”?
处理“java.lang.OutOfMemoryError:PermGen space”错误下一篇
下一篇处理“java.lang.OutOfMemoryError:PermGen space”错误

最新文章

  • 函数`__construct`用来干嘛的
    发布日期:2018-03-26
  • 通过访客的IP得到他们的地区
    发布日期:2018-03-26
  • 合并两个PHP对象的最好的方法是什么?
    发布日期:2018-03-26
  • 该如何把一该如何把一个对象转化成数组?
    发布日期:2018-03-26
  • 什么是输出缓冲区?
    发布日期:2018-03-26
  • 在PHP中怎么把用逗号分隔的字符串分隔在一个数组里?
    发布日期:2018-03-26
  • 在PHP中使用foreach循环时查找数组的最后一个元素
    发布日期:2018-03-26
关于好问
收集整理一些有用的问题和回答,造福中国的程序旺和IT喵们!
友情链接
起飞页 
相关信息
版权声明
Copyright © 2016 - 2022  苏州卡达网络科技有限公司 备案号:苏ICP备09008221号