簡體   English   中英

HashMap中 <String, Object> - 如何返回只有參數的對象?

[英]HashMap<String, Object> - How to return an Object having only its argument?

鑒於以下細節,我需要編寫一個返回Object Person

public class Person {

    private String firstName;
    private String lastName;
    private int deskNo;
    private String departmentName;
    ...
}
// this class also contains get methods for each argument

對象Person存儲在HashMap ,其中Key與每個Object的lastName相同。 值顯然是Person對象。

private final Map<String, Person> employeeHM = new HashMap<>();
...
employeeHM.put("Doe", new Person("Jon", "Doe", 14, "Sales");

我用幾種解決方案解決了這個問題但在每種情況下都失敗了。 有沒有辦法直接比較firstNamelastName並返回匹配的對象? 我的一個想法是使用SetColleciton ,但我相當確定這是過於復雜的事情。

@Override
public Person findPersonByFirstName(String firstName) {
   // ?
}

只需遍歷你的地圖,找到正確名字的人:

private Person getPersonByFirstName(String firstName) {
    for (Person p : employeeHM.values()) {
        if (p.getFirstName().equals(firstName))
           return p;
    }
    return null;
}

請注意,這將為您找到第一個具有正確名字的人。 如果多個人擁有相同的名字,則可能是隨機的。

我不會為你編寫代碼。 但下面是我的想法。

只需獲取Map的所有值( map.values() )。 並迭代它們。 檢查名字是否匹配並返回。 請注意,您最終可能會有多個具有相同名字的人,因此可能需要更改返回類型。

另一個建議是,使用名字或姓氏作為地圖的關鍵幾乎是一個更糟糕的想法。 如果我是你,我將使用他的Id或DeskNo作為唯一的鑰匙。

正如其他人已經建議的那樣,如果您迭代值而不是鍵,則可以實現這一點。

但這真的是你想要做的嗎? 如果是,為什么不將第一個名稱作為鍵呢? Map的想法是,對於每個唯一鍵,您有一個或多個值,從Map獲得O(1)復雜度。 迭代值來獲取密鑰有點奇怪,它具有O(n)復雜度。

在這種情況下,我強烈建議您重新考慮您的數據結構,並嘗試使用更適合您的數據。

首先,你應該重新考慮在這種情況下使用HashMap,因為顯然你的密鑰並不總是一樣的。 您要實現的幾乎是數據集機制,您可以考慮使用DB和正確的查詢語言。

除非您的實體(Person)實際上具有某種鍵,即一個突出顯示實體的字段,否則絕對沒有理由使用hashMap。

作為快速修復,如果您使用的是Java8,則可以使用lambda表達式輕松實現所需的結果:

private final Collection<Person> employeeHM = new HashSet<>();

employeeHM.add(new Person("Jon", "Doe", 14, "Sales"));

並解析集合:

Person employeeDoe = employeeHM.stream().filter(person -> person.getLastName().equals("Doe")).findFirst().orElse(null);

Person employeeJon = employeeHM.stream().filter(person -> person.getFirstName().equals("Jon")).findFirst().orElse(null);

請注意,這將返回與篩選器lambda匹配的第一個元素,如果沒有找到則返回null。

此外,解析是內聯完成的,這一事實消除了對您所擁有的特定查找方法的需求。 只需在任何地方調用lambda表達式,Java框架就代表您完成所有魔術。

我認為你所尋找的是找到一個給定名字和姓氏的人,同時存儲在給定的HashMap中。

您可以將List作為值(並遍歷它)或使用HashMaps的HashMap進行硬核處理。 或者您可以使用名稱的鍵值對象作為鍵。

private final Map<String, Map<String, Person>> employeeHM = new HashMap<>();

Map<String, Person> value = employeeHM.get("Doe");
if (value == null) {
  value = new HashMap<String, Person>();
  employeeHM.put("Doe", value);
}
value.put("Jon", new Person("Jon", "Doe", 14, "Sales");

GET由以下人員完成:

Map<String, Person> does = employeeHM.get("Doe")
Person jonDoe = does.get("Jon");

暫無
暫無

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

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