【发布时间】:2016-06-26 18:38:37
【问题描述】:
我接到了一项任务,我需要使用 HashMap 或 TreeMap 来保存学生列表和他们的成绩。我假设他们的键是姓名,值是学生的成绩。我被指示允许同名的学生。
因为 HashMap 或 TreeMap 都不允许重复键,所以我不能将名称作为键,对吗?
有没有允许重复键的简单方法? TreeMap 如何对重复键进行排序?
我还需要能够按名称排序,所以我更喜欢使用 TreeMap。
【问题讨论】:
我接到了一项任务,我需要使用 HashMap 或 TreeMap 来保存学生列表和他们的成绩。我假设他们的键是姓名,值是学生的成绩。我被指示允许同名的学生。
因为 HashMap 或 TreeMap 都不允许重复键,所以我不能将名称作为键,对吗?
有没有允许重复键的简单方法? TreeMap 如何对重复键进行排序?
我还需要能够按名称排序,所以我更喜欢使用 TreeMap。
【问题讨论】:
与其寻找不同的数据结构,不如考虑一下您可以使用的不同键,这些键是是唯一的。这是软件开发中非常常见的问题,因为现实世界中的许多概念并不像我们希望的那样独特。名称(不仅是人名,还有地点和事物)就是一个典型的例子。
虽然有多种可能的解决方案,但一个常见的解决方案是为每个不完全唯一的事物分配一个唯一标识符,并使用 that 作为您的密钥。所以你的地图可能看起来像:
Map<Integer, Person>
当然,这只会解决问题,因为您现在还必须能够查找一个人的 ID,假设您只知道他们的名字。这可以通过以下方式完成:
Map<String, Set<Integer>>
其中键是名称,值是具有该名称的 ID 集。然后,您必须有一些特定于应用程序的方法来在必要时进一步消除歧义,例如要求用户选择一个。如果您需要按字母顺序排列名称,则第二个Map 可以是TreeMap,或者您可以选择使Person 实现Comparable。
Guava 库还提供了非常好的Multimap 接口,它使Map<K, Set<V>> 等数据结构更易于使用。
【讨论】: