gpt4 book ai didi

java - 在java中使用什么集合来存储具有相同哈希码的多个对象?

转载 作者:行者123 更新时间:2023-12-01 18:19:59 25 4
gpt4 key购买 nike

假设我想存储学生参加的每个类(class)的记录。学生和类(class)都有唯一的标识符,但多个学生可以参加同一类(class),一个学生可以参加多个类(class)。

我想以这样的方式排列这些记录,这样我不必搜索复杂度为 O(n) 的所有记录,但具有相同类 id 的所有对象都解析在同一个槽中,就像哈希表一样有效,但我发现 java HashSet 不支持重复项。

所以我的问题是下一个...我想返回其哈希码已解析到表中同一位置的所有记录的集合,但该数据结构当然必须支持重复项,因为多个学生可以上课X。其中一个槽是解析到同一槽的所有记录的列表。

最佳答案

首先解决哈希码的一般问题。

如果您有许多映射到相同哈希码的不同键,那么一般工作中的哈希表仍然可以工作。然而,哈希表是一对一的映射。他们将每个不同的键映射到一个(且唯一的)记录/条目。在 Java 上下文中,这适用于所有 Map Collection ,致所有人Set集合也是如此……将集合建模为 map 的退化形式。

如果您希望一个键映射到(可能)多个不同的记录/值,那么您需要一个多映射数据结构。这可以(使用 Java 集合类型)模拟为 Map<K, List<V>>Map<K, Set<V>> .

总结一下:

  1. 重要的是键的独特性,而不是哈希码的独特性。 (哈希表可以处理哈希码冲突。)

  2. 如果您有不不同的键,那么您需要一个多重映射。

<小时/>

看看您的特定用例,您似乎拥有一组具有两个外部键的出勤记录;即类 ID 和源 ID。 (我假设每个出勤记录都包含一些代表学生上课出勤的数据。)

这里有两个键这一事实意味着您希望在应用程序的不同位置通过这两个键进行查询;例如“查找 X 学生的出勤记录”、“查找 Y 类的所有出勤记录”。

这意味着您实际上需要 2 个多重映射来支持这些查询;例如Map<StudentID, <Set<AttendanceRecord>>Map<CourseID, <Set<AttendanceRecord>> .

您需要维护几个不变量。这些集合(当然)必须仅包含 AttendanceRecord与相应学生或类(class)相关的对象。

关于java - 在java中使用什么集合来存储具有相同哈希码的多个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27882704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com