我刚刚完成了当前数据结构项目的主要部分,并正在收集统计信息。一个要求是记录TreeMap中所有引用的计数。
此Map包含31,000多个节点,其中String映射到不确定大小的TreeSet。 我需要遍历地图并保持集合中项目数量的运行计数。
最初我的想法是:
Set<String> keySet= lyricWords.keySet();
Iterator<String> iter= keySet.iterator();
String current= iter.next();
while (iter.hasNext){
runCount+= lyricWords.get(current).size();
}
此运行时间太长,无法接受。在最终结构上有更有效的方法吗?我可以在制作地图时保持计数,但教授希望数字基于最终结构本身。
答案 0 :(得分:3)
我不确定。但是,可能,你有不定式循环。尝试:
runCount+= iter.next().size();
答案 1 :(得分:3)
for (Map.Entry<String, TreeSet> e: lyricWords.entrySet()) {
runCount+= e.getValue().size();
}
答案 2 :(得分:1)
我没有看到在制作地图时保持计数的问题。
最后的计数是正确的,你不必再承担迭代整个事情的成本。
我认为树可以和 跟踪其大小
答案 3 :(得分:0)
这对你没有多大用处,因为这是你正在进行的一项任务,但这是一个例子,专门设计用于将键映射到多个值的数据结构显示它比{{{{{{{{{{ 1}}。
Guava的Map<T, Collection<V>>
集合类型会跟踪其中包含的条目总数,因此,如果您使用的是Multimap
而不是TreeMultimap<String, Foo>
,那么您可以致电TreeMap<String, TreeSet<Foo>>
以获取您正在寻找的号码。
顺便说一下,multimap.size()
实现存储了在向其添加或删除条目时更新的条目数的运行总数。你可能能够做到这一点,做一些奇特的东西,子类化Multimap
并包装添加到它的TreeMap
,但这将是非常具有挑战性的这一切都正常我认为。