首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >几个不同的映射可以共享相同的键集吗?

几个不同的映射可以共享相同的键集吗?
EN

Stack Overflow用户
提问于 2018-10-31 01:53:58
回答 2查看 52关注 0票数 0

我特别使用Java,但即使这在Java中是不可能的,我也很有兴趣知道它在任何语言中是否都是可能的。

我在学生类中有一组考试对象,表示学生参加的考试,对于其中的每一项考试,我希望跟踪学生对考试问题的回答,并希望跟踪学生在每次考试中的成绩。

要实现这一点,最直接的方法就是为每个关系创建两个映射。但是,我希望能够保证存在于映射中的任何键都存在于所有映射中,并且从任何映射中删除一个键应该将其从所有映射中删除。当每个映射的键实际上都表示相同的东西时,使用单个公共键集似乎会更有效:学生参加的考试集。

那么,有没有可能让几个不同的map依赖于同一个键集呢?不管这是否可能,有没有理由说这只是一个坏主意?

谢谢!非常感谢您的建议:)

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

EN

回答 2

Stack Overflow用户

发布于 2018-10-31 02:07:19

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

你为什么不改变一下方法呢?您可以说您实际上有一组键、Student和多个值、学生获取的一组Exam和每个Exam的一组Grade

那么,如果您创建了一个名为StudentExams的新类,其中包含一个Map<Exam, Grade>,那又会怎样呢?

代码语言:javascript
运行
复制
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对象。

票数 1
EN

Stack Overflow用户

发布于 2018-10-31 02:21:26

所以有可能让几个不同的映射依赖于同一个键集吗?

最简单的方法是使用一个Map,其中的值包含其他Map的所有值。

这边请

  • 只有一个密钥集。
  • 添加一个密钥会添加一个密钥会删除所有的值。

而不是说

代码语言:javascript
运行
复制
Map<String, String> nameMap
Map<String, Long> counterMap
Map<String, Double> scoreMap

你转而看重

代码语言:javascript
运行
复制
class Values {
    String name;
    long counter;
    double score;
}

Map<String, Values> valuesMap;

可以创建此Map的视图,使其显示为原始的多个Map,但不太可能值得这样做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53070162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档