【问题标题】:Can TreeMap be used to retrieve all key/value pairs above a given key value?可以使用 TreeMap 检索给定键值以上的所有键/值对吗?
【发布时间】:2016-06-21 13:34:45
【问题描述】:

我有一段代码维护对具有给定 ID 的样本所做的修订映射:

private Map<Long, SampleId> sampleRevisionMap = new HashMap<>();

在维护这一点的同时,其他线程可以调用以获取自给定修订号以来所做的所有更改。要找到相关的 ID,我会这样做

public Set<SampleId> getRevisionIDs(long clientRevision) {
    return sampleRevisionMap.entrySet().stream()
                .filter(k -> k.getKey() > clientRevision)
                .map(entry -> entry.getValue())
                .collect(Collectors.toSet());
}            

简而言之,给我所有键值高于阈值的值。

有没有更好的方法来使用有序映射,即 java.utils.TreeMap?

【问题讨论】:

  • 请注意,TreeMap 是不同步的。您是说所有线程都可以跳入读取键/值对。你需要使用Map syncMap = Collections.synchronizedSortedMap( treeMap )
  • 另请注意,来自synchronizedSortedMap 的返回映射将是可变的,其他线程可以在一个线程对其进行迭代时对其进行修改(或其尾部映射的值)。迭代线程必须在其上同步迭代它。请参阅synchronizedSortedMap documentation

标签: java treemap


【解决方案1】:

是的,您可以拨打tailMap

public Collection<SampleId> getRevisionIDs(long clientRevision) {
    return sampleRevisionMap.tailMap(clientRevision).values();
}    

上面还包括映射到clientRevision 的值。如果您想要上面的所有内容,请改用clientRevision+1

【讨论】:

  • @BjarkeMoholt 实际上,它不应该被声明为 TreeMap 类型。它应该声明为 SortedMap 或 NavigableMap 类型。始终引用代表合约的类型而不是实现。
猜你喜欢
  • 1970-01-01
  • 2010-10-01
  • 2020-03-30
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多