簡體   English   中英

如何檢查存儲在哈希圖中的對象中是否存在字符串?

[英]How to check if a string exists in a object which is stored in a hashmap?

我用3個參數創建了一個Employee類。

  1. ID
  2. 名稱
  3. 年齡

要求:根據名稱搜索。 在這種情況下,所有員工都有唯一的名稱。 必須添加鍵為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> ,並且在該地圖上調用putget ,那么hashCodeequals會在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.

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