【问题标题】:java concurrent map sorted by valuejava并发map按值排序
【发布时间】:2012-09-16 14:28:34
【问题描述】:

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

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

地图的键是字符串,值是整数。我正在寻找的是一种检索具有最小值(整数)的键的方法。

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

例子

"user1"=>3 “用户2”=> 1 "user3"=>3

排序列表: “用户2”=> 1 “用户 1”=>3 "user3"=>3

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

谢谢

【问题讨论】:

    标签: java hashmap linkedhashmap sortedmap concurrentskiplistmap


    【解决方案1】:

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

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

    【讨论】:

    • 嗨,谢谢,但我认为我不需要多重映射,因为 key(String)->value(integer) 是唯一的,而且我不能拥有具有 2 个值的相同键,但是我希望我的地图按值(整数)排序​​,或者我在想,但这也无法反转地图并使用整数作为键和字符串作为值,但这可能导致多个键具有相同的值(整数)见我已经更新了示例
    • 所以如果你有多个键指向同一个值并且你反转它,你需要一个 MultiMap,因为现在你有一个具有多个值的键。简而言之,只能按key排序。
    • 是的......你是对的,但是我希望能够在某个时候删除基于键(字符串)的条目。通过反转地图,我认为这会有点困难,因为我必须按值进行搜索。
    • 如果您有倒置地图,则无需搜索。 ;)
    【解决方案2】:

    我最近不得不这样做并最终使用了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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我的地图中的值通过添加/删除键或更改值不断变化
      • 你真的需要随时排序还是只需要时不时查询最小值的key?
      • 其实我只需要时不时地检索最小值,我不在乎它是否排序。有没有办法在不解析整个地图的情况下做到这一点?
      • 不,但这是我能想到的唯一解决方案——这不是 Java 提供或不提供什么的问题,而是一般可行的问题。
      猜你喜欢
      • 2012-11-30
      • 2021-12-02
      • 2021-10-11
      • 1970-01-01
      • 2019-05-03
      • 2021-08-19
      • 2014-04-03
      • 1970-01-01
      • 2018-09-08
      相关资源
      最近更新 更多