簡體   English   中英

在Java中使用什么集合來存儲具有相同哈希碼的多個對象?

[英]What collection to use in java for storing multiple objects that have the same hashcode?

假設我想存儲每個學生參加的課程的記錄。 學生和班級都有唯一的標識符,但是多個學生可以參加同一個班級,一個學生可以參加多個班級。

我想以不必搜索所有復雜度為O(n)的記錄的方式來排列這些記錄,但是具有相同類ID的所有對象都在同一插槽中解析,就像哈希表一樣,除了我發現Java HashSet不支持重復項。

所以我的問題是下一個...我想返回其哈希碼已解析到表中同一位置的所有那些記錄的集合,但是該數據結構必須支持課程的重復,因為多個學生可以參加x班。 這樣的插槽將是解析為相同插槽的所有記錄的列表。

首先解決哈希碼的一般問題。

如果您有許多映射到同一哈希碼的不同鍵,則哈希表在常規工作中仍將起作用。 但是,哈希表是一對一映射。 他們將每個不同的鍵映射到一個(唯一的)記錄/條目。 在Java上下文中,這適用於所有Map集合以及所有Set集合... Set集合建模為簡並的map形式。

如果要一個鍵映射到(潛在地)多個不同的記錄/值,則需要一個多映射數據結構。 可以將其模擬為Map<K, List<V>>Map<K, Set<V>> (使用Java集合類型)。

總結一下:

  1. 重要的是鍵的唯一性,而不是哈希碼的唯一性。 (哈希表可以處理哈希碼沖突。)

  2. 如果您有不同的按鍵,則需要一張多地圖。


查看您的特定用例,您似乎擁有的是一組具有兩個外部密鑰的出勤記錄。 即類ID和源ID。 (我假設每個出勤記錄都包含一些代表學生上課的數據。)

這里有兩個鍵的事實意味着您想同時在應用程序的不同位置進行查詢。 例如“查找學生X的出勤記錄”,“查找Y類的所有出勤記錄”。

這意味着您實際上需要2個多圖來支持這些查詢。 例如Map<StudentID, <Set<AttendanceRecord>>Map<CourseID, <Set<AttendanceRecord>>

您需要維護幾個不變式。 這些設置(當然)必須僅包含與相應學生或課程有關的AttendanceRecord對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM