我有TreeMultimap<Integer, String>
,其中也包含重复键。
我想获得位于特定键内的值的计数 范围, O(logN)时间复杂度。
我首先尝试使用方法TreeMultimap
将SortedMap
转换为asMap()
,然后在所需范围内创建submap
并获取其大小。
SortedMap<Integer, Collection<String>> sortedMap = mapList.getTmm().asMap();
return sortedMap.subMap(beg,end).size();
是否具有复杂性 O(logN)?
另外,我在这里遇到了一个问题。将TreeMultimap
转换为SortedMap
时,值为Collection
类的对象。即TreeMultimap
中具有重复键的键值对包含在单个Collection
类中。
所以方法size()
返回错误的值。
我有没有其他方式实现这一目标? 任何帮助表示赞赏。
答案 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)
。但是,如果您将SortedMultiset
与Multimap
一起更新,您应该能够及时交换空间。