我有一个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()
返回错误的值。我还有其他方法可以实现这一目标吗?
任何帮助表示赞赏。
最佳答案
您可以尝试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)
。但是,如果您将SortedMultiset
与Multimap
一起进行更新,则应该可以交换空间。