【问题标题】:java: get count of values within a given key range of Guava Multimapjava:获取Guava Multimap的给定键范围内的值的计数
【发布时间】:2016-10-25 03:40:24
【问题描述】:

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

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

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

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

它是否具有复杂性O(logN)

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

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

【问题讨论】:

  • "复杂度是否为 O(logN)?"没关系,因为它没有返回正确的答案:它不是值的计数,而是键的计数。
  • 是的。还有其他方法吗? @AndyTurner

标签: java dictionary guava multimap sortedmap


【解决方案1】:

你可以试试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 一起更新,您应该能够以空间换时间。

【讨论】:

    猜你喜欢
    • 2018-01-06
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多