我有一个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; }
理想情况下,如果您有多个线程访问的某个状态(例如此映射),则将该状态封装在其他类的后面,以便每个线程不直接更新映射.