我收到了一项作业,需要使用 HashMap 或 TreeMap 来保存学生及其成绩的列表。我认为它们的键是名称,值是学生的成绩。我被指示允许同名的学生。
因为 HashMap 或 TreeMap 都不允许重复键,所以我不能将名称作为键,对吗?
有没有一种简单的方法可以允许重复的键? TreeMap 如何对重复键进行排序?
我还需要能够按名称排序,所以我更喜欢使用 TreeMap。
最佳答案
不要寻找不同的数据结构,而是考虑可以使用的不同键,这些键是唯一的。这是软件开发中一个非常常见的问题,因为现实世界中的许多概念并不像我们希望的那么独特。名称(不仅是人名,还包括地名和事物的名称)就是一个典型的例子。
虽然有多种潜在的解决方案,但常见的一种解决方案是为每个不完全唯一的事物分配一个唯一标识符,并使用该作为 key 。所以你的 map 可能看起来像:
Map<Integer, Person>
当然,这只能解决问题,因为假设您只知道他们的名字,您现在还必须能够查找一个人的 ID。这可以通过以下方式完成:
Map<String, Set<Integer>>
其中键是名称,值是具有该名称的 ID 集。然后,您必须采用某种特定于应用程序的方法来进一步消除歧义(如有必要),例如要求用户选择一个。这一秒Map
可以是TreeMap
如果您需要按字母顺序排列名称,或者您可以选择 Person
实现Comparable
.
Guava图书馆还提供了非常好的 Multimap
接口(interface),它使数据结构像 Map<K, Set<V>>
更容易合作。
关于java - 如何在 HashMap 或 TreeMap 中允许重复键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38041869/