我有一个TreeMultimap<Integer, String>,其中也包含重复的键。


  我想获取特定键中的值计数
  范围,也就是O(logN)时间复杂度。


我首先尝试通过使用方法TreeMultimapSortedMap转换为asMap(),然后在所需范围内创建submap并获取其大小。

SortedMap<Integer, Collection<String>> sortedMap = mapList.getTmm().asMap();
return sortedMap.subMap(beg,end).size();


是否具有复杂度O(logN)?

另外,我在这里遇到了一个问题。将TreeMultimap转换为SortedMap时,值是Collection类的对象。即,在TreeMultimap中具有重复键的键/值对包含在单个Collection类中。
因此,方法size()返回错误的值。

我还有其他方法可以实现这一目标吗?
任何帮助表示赞赏。

最佳答案

您可以尝试SortedMultiset,它具有用于远程查询的方法:

subMultiset


  返回限制在lowerBound和upperBound之间的此多集的视图。


样例代码:

import com.google.common.collect.*;

public class GuavaMultiMap {
    public static void main(String [] args) {
        Multimap<Integer, String> map = TreeMultimap.create();
        map.put(0, "-1");
        map.put(1, "a");
        map.put(1, "b");
        map.put(2, "c");
        map.put(2, "d");
        map.put(3, "e");

        SortedMultiset<Integer> keys = TreeMultiset.create();
        keys.addAll(map.keys());

        SortedMultiset<Integer> range = keys.subMultiset(1, BoundType.CLOSED, 3, BoundType.OPEN);
        System.out.println(range.size());
    }
}


输出:4

上面的代码无法在O(log(N))时间内运行,因为该行keys.addAll(...);O(n)。但是,如果您将SortedMultisetMultimap一起进行更新,则应该可以交换空间。

09-28 02:24