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

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

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

那么有可能使多个不同的映射依赖于相同的键集吗?而且,无论是否可行,是否有任何理由会是一个坏主意?

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

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

最佳答案

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

您为什么不稍微改变一下方法。
您说您实际上拥有一组键,Student和多个值,学生使用的一组Exam和每个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并将其提取的Exam对象集与Grade对象一起提取。

关于java - 几个不同的 map 可以共享相同的键集吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53070162/

10-09 04:52