你会使用哪种数据结构:TreeMap还是HashMap?(Java)

25 浏览
0 Comments

你会使用哪种数据结构:TreeMap还是HashMap?(Java)

这个问题已经有答案了HashMap、LinkedHashMap和TreeMap的区别

描述 | 一个Java程序,读取文本文件并按字母顺序列出每个唯一单词及其在文本中出现的次数。

程序应声明一个Map<String,Integer>类型的变量来存储单词及其对应的出现频率。但具体使用哪种类型呢?TreeMap<String,Number>还是HashMap<String,Number>

输入应转换为小写。

一个单词不包含这些字符之一:\\ t \\ t \\ n] f.,!?:;“()\'

输出示例:

 Word            Frequency
  a                 1
  and               5
  appearances       1
  as                1
         .
         .
         .

备注 | 我知道,我已经看到了用Perl进行优雅解决的近似两行的代码。然而,我想在Java中看到它实现。

编辑:噢,展示使用其中一种结构的实现(在Java中)会有帮助。

admin 更改状态以发布 2023年5月23日
0
0 Comments

TreeMap胜过HashMap,因为TreeMap已经帮你排序了。

然而,你可能想考虑使用更适合的数据结构——一个包。参见Commons Collections以及TreeBag类:

它有一个良好优化的内部结构和API:

bag.add("big")
bag.add("small")
bag.add("big")
int count = bag.getCount("big")

编辑:Jon已经回答了HashMap与TreeMap的性能问题-HashMap和排序可能更快(试试看!),但TreeBag更容易。对于包,HashBag与TreeBag都适用。基于实现(使用可变整数),包应该优于等效的纯Integer映射。唯一确定性的方法是测试,就像任何性能问题一样。

0
0 Comments

TreeMap 对我来说似乎是一个不需考虑的选择,因为它满足了“按字母顺序排序”的需求。 HashMap 在迭代时没有排序; TreeMap 按自然键顺序迭代。

编辑:我认为Konrad的评论可能是在建议“使用HashMap,然后再排序。”这很好,因为虽然一开始我们要进行N次迭代,但由于重复项,最后会有K <= N个键。我们最好把昂贵的部分(排序)留到最后,当我们拥有较少的键时,而不是在进行排序的同时承受小而非固定的负载。

话虽如此,我暂时还是坚持我的答案:因为这是实现目标最简单的方式。我们不太清楚提问者是否特别担心性能,但问题暗示他关心优雅和简洁。使用TreeMap 可以使这个过程非常简洁,这对我很有吸引力。我猜如果性能真的是一个问题,可能有更好的方法来解决它,而不是TreeMapHashMap 🙂

0