几个不同的地图可以共享相同的键集吗?

时间:2018-10-30 17:53:58

标签: java dictionary

特别是我正在使用Java,但是即使在Java中无法做到这一点,我也很想知道是否可以使用任何语言。

我在学生类中有一组考试对象,代表该学生已参加的考试,并且对于该组中的每个考试,我都希望跟踪学生对考试题的回答,并且希望跟踪每次考试成绩的分数。

实现此目的最直接的方法是为每个关系简单地拥有两个映射。但是,我希望能够保证地图中存在的任何键对于所有地图都存在,并且从任何地图中删除键都应将其从所有地图中删除。当每个地图的键实际上都代表相同的东西时,似乎只有一个通用的键集会更有效:这是学生参加的一组考试。

那么有可能使多个不同的映射依赖于相同的键集吗?而且,不管是否有可能,有什么理由只是一个坏主意?

谢谢!我感谢任何建议:)

编辑:为了便于记录,我只是实例化一个新地图,然后遍历原始地图的键集,将每个键添加到新地图中,但是我认为这不会达到我想要的效果。我将创建一个新的键集,该键集恰好包含原始键集的所有引用。我的两个映射实际上不会依赖于相同的键集,因此更改一个映射不会影响另一个映射。

2 个答案:

答案 0 :(得分:1)

在Java(以及大多数语言)中,键集在Map实现中内部紧密耦合,因为它会影响查找键以查找其值的方式。一个Map可以使用HashSet实现,将值对象与键相关联,并处理哈希冲突,而另一个Map可以使用TreeSet。您可以创建自己的Map实现,但是我怀疑它只是错误的模型。

为什么不改变方法。 您说您实际上有一组键,Student和多个值,一组学生使用的Exam和每个{{ 1}}。

那么如果您创建了一个名为Grade的新类,该类中有一个Exam怎么办?

StudentExams

然后在主Map<Exam, Grade>中有一个public class StudentExams { private Map<Exam, Grade> examGrades = ... //choose whatever you want //... constructor and setter methods here if you need them public Set<Exam> getExams() { return examGrades.keySet(); } /** * Returns the Grade for the exam the student took, * or Optional.empty() if the student did not take that exam. */ public Optional<Grade> getGrade(Exam exam) { return Optional.ofNullable(examGrades.get(exam)); } }

通过这种方式,每个学生都可以得到他的Map对象,并将Map<Student, StudentExams>对象集和它们的StudentExams对象一起提取出来。

答案 1 :(得分:0)

  

那么有可能使多个不同的映射依赖于相同的键集吗?

最简单的方法是创建一个Map,其值包含其他map的所有值。

这样

  • 只有一个键集。
  • 添加键会添加所有值。
  • 删除键会删除所有值。

代替说

Map<String, String> nameMap
Map<String, Long> counterMap
Map<String, Double> scoreMap

您反而重视

class Values {
    String name;
    long counter;
    double score;
}

Map<String, Values> valuesMap;

可以创建此Map的视图,使其以原始多个Map的形式出现,但这不太值得。