有没有更好的方法来计算地图中的值?

时间:2010-11-04 20:05:02

标签: java data-structures treemap

我刚刚完成了当前数据结构项目的主要部分,并正在收集统计信息。一个要求是记录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();
}

此运行时间太长,无法接受。在最终结构上有更有效的方法吗?我可以在制作地图时保持计数,但教授希望数字基于最终结构本身。

4 个答案:

答案 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}}。

GuavaMap<T, Collection<V>>集合类型会跟踪其中包含的条目总数,因此,如果您使用的是Multimap而不是TreeMultimap<String, Foo>,那么您可以致电TreeMap<String, TreeSet<Foo>>以获取您正在寻找的号码。

顺便说一下,multimap.size()实现存储了在向其添加或删除条目时更新的条目数的运行总数。你可能能够做到这一点,做一些奇特的东西,子类化Multimap并包装添加到它的TreeMap,但这将是非常具有挑战性的这一切都正常我认为。