我正在寻找一种方法来拥有并发映射或类似的键>值存储,可以按值而不是键排序。
到目前为止,我正在查看ConcurrentSkipListMap,但我找不到按值对其进行排序的方法(使用Comparator),因为该方法仅接收键作为参数compare
。
映射的键为字符串,值为整数。我正在寻找一种检索具有最小值(整数)的键的方法。
我还在考虑使用 2 张地图,并使用整数键和字符串值创建一个单独的地图,这样我就可以根据需要按整数排序地图,但是可以有多个具有相同值的整数,这可能会导致我遇到更多问题。
例
"用户 1"=>3"用户 2"=>1"用户3"=>3
排序列表:"用户 2"=>1"用户 1"=>3"用户3"=>3
有没有办法做到这一点,或者任何第三方库都可以做到这一点?
谢谢
要按值排序,其中可以有多个"值"到"键"映射,您需要一个 MultiMap。这需要同步,因为没有并发版本。
这并不意味着性能会很差,因为这取决于您调用此数据结构的频率。 例如,它可能加起来长达 1 微秒。
我最近不得不这样做,最终使用了一个键包含字符串和整数的ConcurrentSkipListMap
。我最终使用了下面提出的答案。核心见解是,您可以构建代码以允许在删除前一个键之前使用不同的值重复键。
在 ConcurrentSkipListMap/ConcurrentSkipListSet 中重新排序键的原子方法?
问题是保留一组动态字符串,这些字符串与可以从不同线程并发更改的整数相关联,如下所述。这听起来与你想做的事情非常相似。
有没有一个可嵌入的Java替代Redis?
这是我实现的代码:
https://github.com/HarvardEconCS/TurkServer/blob/master/turkserver/src/main/java/edu/harvard/econcs/turkserver/util/UserItemMatcher.java
ConcurrentMap
的原则是可以并发访问 - 如果您希望随时对其进行排序,性能将受到严重影响,因为该映射需要完全同步(如哈希表),从而导致吞吐量不佳。
因此,我认为您最好的选择是通过将所有元素放在不可修改的树状图中来返回地图的排序视图(尽管按值对树状图进行排序需要一些调整)。