java:获取Guava Multimap给定键范围内的值的计数

时间:2016-10-25 03:40:25

标签: java dictionary guava multimap sortedmap

我有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()返回错误的值。

我有没有其他方式实现这一目标? 任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:3)

您可以尝试SortedMultiset,它有一个远程查询方法:

<强> subMultiset

  

返回此multiset的视图,该视图仅限于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一起更新,您应该能够及时交换空间。