特别是我正在使用Java,但是即使在Java中无法做到这一点,我也很想知道是否可以使用任何语言。
我在学生类中有一组考试对象,代表该学生已参加的考试,并且对于该组中的每个考试,我都希望跟踪学生对考试题的回答,并且希望跟踪每次考试成绩的分数。
实现此目的最直接的方法是为每个关系简单地拥有两个映射。但是,我希望能够保证地图中存在的任何键对于所有地图都存在,并且从任何地图中删除键都应将其从所有地图中删除。当每个地图的键实际上都代表相同的东西时,似乎只有一个通用的键集会更有效:这是学生参加的一组考试。
那么有可能使多个不同的映射依赖于相同的键集吗?而且,不管是否有可能,有什么理由只是一个坏主意?
谢谢!我感谢任何建议:)
编辑:为了便于记录,我只是实例化一个新地图,然后遍历原始地图的键集,将每个键添加到新地图中,但是我认为这不会达到我想要的效果。我将创建一个新的键集,该键集恰好包含原始键集的所有引用。我的两个映射实际上不会依赖于相同的键集,因此更改一个映射不会影响另一个映射。
答案 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的形式出现,但这不太值得。