![](/img/trans.png)
[英]My Hashmap object value list object return only last object i was put in ArrayList<Map<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");
我用幾種解決方案解決了這個問題但在每種情況下都失敗了。 有沒有辦法直接比較firstName
和lastName
並返回匹配的對象? 我的一個想法是使用Set
或Colleciton
,但我相當確定這是過於復雜的事情。
@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.