尤其是我正在使用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/