【问题标题】:Is there a better way to calculate the values in a Map?有没有更好的方法来计算地图中的值?
【发布时间】:2010-11-04 20:05:02
【问题描述】:

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

运行时间太长,无法接受。有没有更有效的方法在最终结构上做到这一点?我可以在构建地图时记数,但教授希望这些数字基于最终结构本身。

【问题讨论】:

  • 在 while 循环中你应该有 iter = iter.next()
  • 旁注:Joshua Bloch 的 Effective Java 建议使用 for each 语法 (for (String s : lyricWords.keySet())),而不是在 Java 5 和更新版本中尽可能直接使用迭代器。 (第 212 页)
  • @Mikhail:实际上,他应该使用增强的 for 循环。迭代器是如此上千年......

标签: java data-structures treemap


【解决方案1】:

我不确定。但是,可能你有不定式循环。试试:

runCount+= iter.next().size();

【讨论】:

    【解决方案2】:
    for (Map.Entry<String, TreeSet> e: lyricWords.entrySet()) {
      runCount+= e.getValue().size();
    }
    

    【讨论】:

    • 绝对喜欢这种方式。
    • 同意,但它比原来的解决方案更有效吗? (也许只是因为没有无限循环)......按照thejh建议的方式来为您节省无限循环,但是在这些类型的项目中,您应该学习使用迭代器来完成它,因为您需要识别何时可能发生无限循环以及如何避免它。
    【解决方案3】:

    我认为在构建地图时保持计数没有问题。

    计数最终将是正确的,并且您不必承担再次遍历整个事物的成本。

    我认为树可以并且应该跟踪它的大小

    【讨论】:

    • 这将是相当困难的,除非构建地图的整个过程都在一个地方完成。如果已添加到地图中的其中一个 TreeSet 稍后在其他地方添加了某些内容,那么总数将如何更新?
    • 出于某种原因,我假设他有一个包含地图和树木的类,并且他正在通过它访问地图。
    【解决方案4】:

    这对您没有多大用处,因为这是您正在处理的作业,但这是一个示例,其中专门设计用于将键映射到多个值的数据结构显示它比 @987654322 好得多@。

    GuavaMultimap 集合类型会跟踪它包含的条目总数,因此如果您使用的是TreeMultimap&lt;String, Foo&gt; 而不是TreeMap&lt;String, TreeSet&lt;Foo&gt;&gt;,您可以调用multimap.size() 来获取数字你正在寻找。

    顺便说一句,Multimap 实现存储了在向其中添加或删除条目时更新的条目总数。您可能可以通过对TreeMap 进行子类化并包装添加到其中的TreeSets 来做一些花哨的事情来做到这一点,但是要使其全部正常工作将非常具有挑战性我想。

    【讨论】:

    • 感谢领导。尽管我不会在这个项目中使用它,但我接受了您的回答,因为您确实对我的问题给出了最好的回答。
    猜你喜欢
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 2022-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多