我特别使用Java,但即使这在Java中是不可能的,我也很有兴趣知道它在任何语言中是否都是可能的。
我在学生类中有一组考试对象,表示学生参加的考试,对于其中的每一项考试,我希望跟踪学生对考试问题的回答,并希望跟踪学生在每次考试中的成绩。
要实现这一点,最直接的方法就是为每个关系创建两个映射。但是,我希望能够保证存在于映射中的任何键都存在于所有映射中,并且从任何映射中删除一个键应该将其从所有映射中删除。当每个映射的键实际上都表示相同的东西时,使用单个公共键集似乎会更有效:学生参加的考试集。
那么,有没有可能让几个不同的map依赖于同一个键集呢?不管这是否可能,有没有理由说这只是一个坏主意?
谢谢!非常感谢您的建议:)
编辑:对于记录,我只需要实例化一个新的映射,然后遍历原始映射的键集,将每个键添加到新的映射中,但我认为这不会达到我想要的效果。我将创建一个新的键集,该键集恰好包含原始键集的所有引用。我的两个map实际上并不依赖于相同的键集,因此更改其中一个不会影响另一个。
发布于 2018-10-30 18:07:19
在Java语言(和大多数语言)中,键集在Map
实现内部是紧密耦合的,因为它会影响如何查找键以找到它们的值。一个Map
可以使用将值对象与键相关联的HashSet
实现,并处理散列冲突,而另一个Map
可以使用TreeSet
。您可以创建自己的Map
实现,但我怀疑它的模型是错误的。
你为什么不改变一下方法呢?您可以说您实际上有一组键、Student
和多个值、学生获取的一组Exam
和每个Exam
的一组Grade
。
那么,如果您创建了一个名为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
对象。
发布于 2018-10-30 18:21:26
所以有可能让几个不同的映射依赖于同一个键集吗?
最简单的方法是使用一个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,但不太可能值得这样做。
https://stackoverflow.com/questions/53070162
复制相似问题