[英]Object Hash Mapping for a primitive Java Map (Mapping POJO's into Map)
[英]Use a Java hash map even when there is no “mapping”?
我想存儲一些對象,然后能夠盡可能有效地檢索它們。 我也會在某些條件下刪除其中一些。 似乎哈希映射將是正確的選擇。
但是,從我所看到的,哈希映射總是將值與另一個值相關聯? 例如,“john”和“555-5555”,他的電話號碼。
現在,我的情況。 假設我有一群人,每個人都與其他人聯系在一起。 所以,我需要每個人存儲其聯系人。
我正在做的是讓每個人都有一個hashmap,然后我將添加到hash otherPerson,otherPerson。 基本上,關鍵是價值。 我做錯了嗎?
編輯我不認為HashSet會解決我的問題,因為我必須檢索值來更新它,並且沒有get方法。 刪除返回一個布爾值,所以我甚至無法刪除它再將它放回去,無論如何這可能是一個壞主意。
如果您只需要檢查A是否是B的聯系人之一,那么Set就是選擇。 它有contains()用於此目的。
否則,最合適的可能是Map,因為您需要高效的檢索操作。 你說當前你使用相同的對象作為鍵和值,但我不確定你是如何獲得密鑰的。 假設您想從B的聯系人那里獲得聯系人A,並使用“B.contacts.get(A)”之類的內容,您從哪里獲得A? 如果你已經擁有A,那又有什么可以從地圖上獲取它? (也許有同一個人的多個實例?)
除非同一個人有多個實例,否則我會為每個人定義一個類似於唯一屬性的ID,並將其用作聯系人地圖的關鍵字。 另外,你為person類定義了equal()/ hashCode()嗎? Map / Set使用hashCode()和equal()來查找匹配。 根據您的使用情況,您可能需要考慮重寫它們以提高效率。
那么,你在這里尋找的數據結構,將是一個HashSet(或其他類型的集合),我認為(如果您的框架/庫提供它)。 一組只是說“我有以下項目”而不是“我將以下項目映射到以下值”。 這就是你在這里建模的內容。
至於HashSet與其他實現(如果存在):這完全取決於你正在做什么。 如果你需要快速查找,即“這個元素在集合中嗎?” 問題,然后哈希是一件好事。 其他底層數據結構可能更適合其他集合操作,例如union,intersection等。
哈希表/地圖只需要您有辦法獲得您以后想要查找的值; 這就是關鍵所在。
但是,在您的具體情況下,聽起來您正在尋找一種方法來存儲人與人之間的關系,而您所追蹤的是A人是否與B有關系。這種方式的更好表現事物是鄰接清單 。
我不認為HashSet會解決我的問題,因為我必須檢索值來更新它,並且沒有get方法。
這是一個令人費解的聲明。 為什么要使用get
方法檢索值來更新它? 當然,如果您知道需要從集合/地圖中檢索哪個對象,則無需檢索它。
例如:
HashSet<Person> relations = ...
Person p = ...
if (relations.remove(p)) {
// we removed an object such that p.equals(obj) is true.
}
現在,如果您擔心被刪除的對象與 p
相同但不完全相同 ,那么在我看來您的設計有問題。 或者:
Person
實例,或者 Person
實例不相同,或者 equals(Object)
。 簡而言之,問題在於您沒有正確管理對象標識。
我錯過了什么或者你不需要一個ArrayList<Person>
?
我只是將聯系人存儲在List<Person>
。 例如
public class Person {
private List<Person> contacts;
}
關於編輯個別接觸,實在是沒有父母Person
的責任這樣做。 它應該在最高添加/刪除聯系人。 您可以通過contacts.add(otherPerson)
或contacts.remove(otherPerson)
完美地完成此操作。
當你想編輯個別Person
,這可能是一個觸點,只得到它的句柄獨立,如personDAO.find(personId)
然后相應地更新它。 編輯自己的細節實際上也是Person
自己的責任。 通過良好的ORM,更改將反映在其他Person
的聯系人列表中。
如果您需要遍歷人員,或要求他們進行排序,請考慮使用TreeMap或TreeSet而不是散列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.