簡體   English   中英

對象列表中元素的相等性檢查

[英]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"));

這是您可以使用的代碼。 我正在考慮讓empIdEmployee 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.

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