加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 在Map中查找最高n值

发布时间:2020-12-15 00:46:44 所属栏目:Java 来源:网络整理
导读:我有一个String- Integer的大地图,我想在地图中找到最高的5个值.我目前的方法是将地图转换为对(键,值)对象的数组列表,然后在获取前5之前使用Collections.sort()进行排序.键可以在操作过程中更新其值. 我认为这种方法是可以接受的单线程,但是如果我有多个线程
我有一个String-> Integer的大地图,我想在地图中找到最高的5个值.我目前的方法是将地图转换为对(键,值)对象的数组列表,然后在获取前5之前使用Collections.sort()进行排序.键可以在操作过程中更新其值.

我认为这种方法是可以接受的单线程,但是如果我有多个线程,所有触发转置和频繁排序它似乎不是很有效.替代方案似乎是维护最高5个条目的单独列表,并在地图上的相关操作发生时保持更新.

请问我有什么建议/替代方案可以优化吗?如果有好处,我很乐意考虑不同的数据结构.

谢谢!

解决方法

I think this approach is acceptable single threaded,but if I had multiple threads all triggering the transpose and sort frequently it doesn’t seem very efficient. The alternative seems to be to maintain a separate list of the highest 5 entries and keep it updated when relevant operations on the map take place.

你可以采取一种方法.当线程请求映射的“已排序视图”时,创建映射的副本,然后处理该映射的排序.

public List<Integer> getMaxFive() {
    Map<String,Integer> copy = null;
    synchronized(lockObject) {
        copy = new HashMap<String,Integer>(originalMap);
    }

    //sort the copy as usual
    return list;
}

理想情况下,如果您有多个线程访问的某个状态(例如此映射),则将该状态封装在其他类的后面,以便每个线程不直接更新映射.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读