按值排序的java并发映射

时间:2012-09-16 14:28:35

标签: java hashmap linkedhashmap sortedmap concurrentskiplistmap

我正在寻找一种方法来获得并发映射或类似的key->值存储,可以按值而非按键排序。

到目前为止,我一直在查看ConcurrentSkipListMap,但我无法找到按值排序的方法(使用Comparator),因为compare方法只接收键作为参数。

地图的键为String,值为Integer。我正在寻找一种方法来检索具有最小值(整数)的密钥。

我还在考虑使用2个映射,并使用Integer键和String值创建一个单独的映射,这样我将按照我想要的整数排序映射,但是可以有多个具有相同的整数价值,这可能会导致我遇到更多问题。

实施例

“用户1”=→3 “用户2” =大于1 “用户3”=→3

排序清单: “用户2” =大于1 “用户1” =→3 “用户3”=→3

有没有办法做到这一点,或者是否有任何第三方库可以做到这一点?

由于

3 个答案:

答案 0 :(得分:1)

要按值排序,您可以在其中设置多个“值”到“键”映射,您需要MultiMap。这需要同步,因为没有并发版本。

这并不意味着性能会很差,因为这取决于您调用此数据结构的频率。例如它可以加起来1微秒。

答案 1 :(得分:0)

ConcurrentMap的原则是它可以同时访问 - 如果你想在任何时候对它进行排序,性能将受到严重影响,因为该映射需要完全同步(如哈希表),导致吞吐量很低。

所以我认为最好的办法是通过将所有元素放在一个不可修改的TreeMap中来返回地图的排序视图(尽管按值排序TreeMap需要稍微调整一下)。

答案 2 :(得分:0)

我最近不得不这样做并最终使用ConcurrentSkipListMap,其中键包含字符串和整数。我最终使用了下面提出的答案。核心的见解是,您可以构建代码以允许在删除前一个密钥之前复制具有不同值的密钥。

Atomic way to reorder keys in a ConcurrentSkipListMap / ConcurrentSkipListSet?

问题是保留一组动态字符串,这些字符串与可能从不同线程同时更改的整数相关联,如下所述。这听起来与你想要做的非常相似。

Is there an embeddable Java alternative to Redis?

以下是我的实施代码:

https://github.com/HarvardEconCS/TurkServer/blob/master/turkserver/src/main/java/edu/harvard/econcs/turkserver/util/UserItemMatcher.java