[英]How to check if a string exists in a object which is stored in a hashmap?
我用3個參數創建了一個Employee類。
要求:根據名稱搜索。 在這種情況下,所有員工都有唯一的名稱。 必須添加鍵為id的對象。 在極少數情況下,需要根據名稱進行搜索。
我做了什么 :
在該類中,我將重寫hashCode和Equals方法。
我將這些對象的列表添加到哈希圖中,其ID為鍵,值作為Employee對象
但是在添加或從哈希圖搜索時,兩種方法都不會被調用
那么在hasmap上這些方法的用途是什么?
員工階層
public class Employee {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int hashCode() {
return name.hashCode();
}
public boolean equals(Employee emp) {
if (emp == null)
return false;
else if (emp.name.equalsIgnoreCase(this.name))
return true;
else
return false;
}
}
主要方法:
public class HashMapTest {
public static void main(String[] args) {
Employee emp1=new Employee();
emp1.setId(1);
emp1.setName("Maclean");
emp1.setAge(24);
Employee emp2=new Employee();
emp2.setId(2);
emp2.setName("Sampath");
emp2.setAge(25);
Employee emp3=new Employee();
emp3.setId(3);
emp3.setName("Achar");
emp3.setAge(27);
Employee emp4=new Employee();
emp4.setId(4);
emp4.setName("Sudheer");
emp4.setAge(25);
Employee emp5=new Employee();
emp5.setId(5);
emp5.setName("Kunder");
emp5.setAge(25);
HashMap<Integer, Employee> empmap=new HashMap();
empmap.put(emp1.getId(), emp1);
empmap.put(emp2.getId(), emp2);
empmap.put(emp3.getId(), emp3);
empmap.put(emp4.getId(), emp4);
empmap.put(emp5.getId(), emp5);
Employee emp=new Employee();
emp.setName("Maclean");
System.out.println(empmap.containsValue(emp));
System.exit(1);
}
}
更新解決方案:
感謝所有的答案。
1.僅當Key是一個對象並且該方法存在於Key類中時,hashCode方法才被調用
2. Equals(Employee emp)導致函數重載而不是覆蓋。 我應該使用equals(Object o)
更改代碼以解決問題
@Override
public boolean equals(Object o) {
if (o == null)
return false;
if (!(o instanceof Employee))
return false;
Employee emp = (Employee) o;
if (emp.name.equalsIgnoreCase(this.name))
return true;
else
return false;
}
您沒有重寫需要做的Object.equals(Object o)。 您正在超載。 這就是為什么它沒有被調用的原因。
試試這個equals():
public boolean equals(Object o) {
if (o == null)
return false;
if (!(o instanceof Employee))
return false;
Employee emp = (Employee) o;
if (emp.name.equalsIgnoreCase(this.name))
return true;
else
return false;
}
在該類中,我將重寫hashCode和Equals方法。 [...]但是在添加哈希表或從哈希表搜索時,這兩種方法都不會被調用。那么在hasmap上這些方法的用途是什么?
如果您有Map<Key, Value>
,並且在該地圖上調用put
或get
,那么hashCode
和equals
會在Key
類而不是Value
類上調用。
就您而言,這意味着如果您執行empmap.put(emp1.getId(), emp1);
然后它檢查emp1.getId()
的哈希值以及該哈希值是否已在映射中。 因此,通常不會在Employee
類上調用這些方法。
另外,如果id
是“唯一”屬性,則Employee.hashCode
可能應該基於該屬性(也equals
hashCode
,也要與hashCode
保持一致),如另一個答案所述, Employee.equals
應該接受任何Object
作為參數。
我沒有測試,但可以嘗試
HashMap<Integer, Employee> empmap=new HashMap<>();
甚至
HashMap<Integer, Employee> empmap=new HashMap<Integer, Employee>();
在Java 8中使用流可以很好地做到這一點。
empmap.values().stream().anyMatch(emp.getName().equals(searchedName));
這將獲取映射中所有條目的集合,並查看流是否與名稱等於searchedName
任何條目匹配。
在可比對象中,您還可以使用Stream.filter()
獲取所有匹配的名稱。
實現不同版本的equals / hashcode是棘手的,因為它以多種方式改變了類的行為。
解決您問題的最簡單的方法是將此方法添加到Employee類中。 HashMap靜默地使用值對象(在本例中為Employee)的equals(Object o)檢查該對象的存在。
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Employee employee = (Employee) o;
if (name != null ? !name.equals(employee.name) : employee.name != null) return false;
return true;
}
請注意,equals(Object o)的此實現僅對名稱起作用,並且不檢查其他字段。
Employee emp=new Employee();
emp.setId(10);
emp.setName("Maclean");
emp.setAge(240);
System.out.println(empmap.containsValue(emp));
System.out.println(emp1.equals(emp));
是
真實真實
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.