簡體   English   中英

即使沒有“映射”,也使用Java哈希映射?

[英]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.

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