![](/img/trans.png)
[英]how to check reference equality in an object which implements content equality?
[英]Element's equality check from list of object
我有一個Employee
對象List
。
class Employee{
private int empId;
private String name;
}
我現在有
List<Employee> empList = new ArrayList<Employee>();
如果我的列表中包含名為“ ABC”的員工,我如何查找?
empList.contains("ABC");
不會工作...
我應該放在Map
嗎? 哪個效率更高??
只是想提一下,我從數據庫中獲取了我的Employee對象。
您可以使用
Map<String, Employee> map = new HashMap<>();
map.put("ABC", new Employee("ABC"));
map.put("John", new Employee("John"));
然后檢查
map.containsKey("ABC")
我應該把它放在地圖上嗎? 哪個效率更高??
因為list的contains()
方法,所以調用indexOf
,它需要遍歷這樣的所有元素
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
作為地圖,哪里不需要遍歷所有元素
覆蓋等於。 然后,您可以使用List.contains
class Employee {
private empId;
private name;
public boolean equals(Object o) {
return (o instanceof Employee && ((Employee)o).empId == empId && ((Employee)o).name = name);
}
}
List l = ...;
Employee e = new Employee(...);
l.add(e);
l.contains(e);
由於您將Employee
對象而不是String
存儲在列表中,因此我認為如果不循環遍歷所有列表對象就不可能進行搜索
for (Employee employee : empList) {
if (employee.getName().equals(searchString))
System.out.println("Found");
}
注意:您的Employee類應該通過getter方法或將其更改為public來訪問名稱字段
還有其他選擇,但這取決於您的要求和速度,空間,可讀性,資源等之間的權衡
我能想到的一件事是HashMap
,它在平均情況下具有恆定的時間查找
HashMap<Integer, String> hm = new HashMap<Integer, String>();
hm.put(1, "Tom");
System.out.println(hm.containsValue("Tom"));
現在,
我應該把它放在地圖上嗎? 哪個效率更高??
無需編碼和分析,而是提前了解您的復雜性 !
在Java 8中,如果要確定員工列表中是否包含名為“ ABC”的員工,則可以執行以下操作:
boolean containsABC = empList.stream().anyMatch(emp -> emp.getName().equals("ABC"));
這是您可以使用的代碼。 我正在考慮讓empId
和Employee
name
匹配時列表返回true。
我也更喜歡在您的代碼中使用Constructor(僅推薦)。
下面的代碼將按您希望的那樣運行。
class Employee {
private int empId;
private String name;
// below overriden function will return true if it found Employee with
// same ID and name
@Override
public boolean equals(Object obj) {
return (obj instanceof Employee //Checking instace of obj
&& ((Employee)obj).empId == empId //Checking empId
&& ((Employee)obj).name.equals(name)); //Checking name
}
// Used constructor to create Employee
Employee(int id, String nm) {
empId = id;
name = nm;
}
}
這是一個示例運行:
List l = new ArrayList();
l.add(new Employee(1, "ME");
System.out.println(l.contains(new Employee(1, "ME"))); //print true
我還要感謝您,當您決定根據Design Pattern重寫equals(...)
方法時,也應該重寫hashCode()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.