地图vs ??用于存储名称和分数

时间:2012-11-24 05:52:44

标签: java list collections hashmap

我使用hashmap来存储数据。 问题是我只是注意到hashmap不能有多个相同的密钥。 我还应该使用什么来存储数据的数据:

  • Name1 100.0
  • Name2 99.8
  • Name3 121.5
  • ...

我正在尝试做的其他事情是在我拨打该密钥时显示某个人的数据。 那么,有没有办法存储多个与一个键相关的值?或者我应该使用其他类型的存储?

4 个答案:

答案 0 :(得分:3)

如果将值存储在另一个数据结构(例如链接列表或每个键索引处的树)中,则散列映射可以具有重复键。然后你只需要决定如何处理碰撞。

修改

HashMap中

["firstKey"] => LinkedList of (3,4,5)
["secondKey"] => null
["thirdKey"] => LinkedList of (3)

答案 1 :(得分:1)

要扩展Matthew Coxes的答案,您可以扩展Hashtable类,以便它自动管理您的列表,并为您提供多个键的外观。

答案 2 :(得分:1)

Google guava库包含一些集合类型,每个键允许多个元素。 Multimap是第一个浮现在脑海中的人。

http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/collect/Multimap.html

Guava一般包含很多非常方便的实用工具,我认为值得一试。

如果您不能使用外部库,您可以简单地(如Matthew Cox所说)将地图和列表与Map<K, List<V>>混合。但是这样做起来有点不方便,因为你必须为每个键初始化一个列表。

答案 3 :(得分:1)

我宁愿选择我自己的数据模型并将其存储在列表中,或者如果你想快速访问则映射,例如

public class Player {
    private String name;
    private List<Float> scores;
}

优点:

  • 你可以很容易地看到,结构想要表达什么
  • 您可以轻松扩展它(例如为玩家添加别名,或计算玩家1的平均值)