2

我正在寻找一种方法来拥有可以按值而不是键排序的并发映射或类似的键->值存储。

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

该映射具有字符串形式的键和整数形式的值。我正在寻找的是一种检索具有最小值(整数)的键的方法。

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

例子

"user1"=>3 "user2"=>1 "user3"=>3

排序列表: "user2"=>1 "user1"=>3 "user3"=>3

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

谢谢

4

3 回答 3

1

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

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

于 2012-09-16T14:31:48.137 回答
1

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

在 ConcurrentSkipListMap / ConcurrentSkipListSet 中重新排序键的原子方式?

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

Redis 是否有可嵌入的 Java 替代方案?

这是我的实现代码:

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

于 2013-03-26T18:52:53.057 回答
0

a 的原理ConcurrentMap是它可以被同时访问——如果你想在任何时候对其进行排序,性能将会受到很大的影响,因为该映射需要完全同步(如哈希表),从而导致吞吐量下降。

因此,我认为您最好的选择是通过将所有元素放在不可修改的 TreeMap 中来返回地图的排序视图(尽管按值对 TreeMap 进行排序需要一些调整)。

于 2012-09-16T14:33:16.590 回答