2015-03-03 30 views
2

我用3個參數創建了一個Employee類。如何檢查存儲在散列表中的對象中是否存在字符串?

  1. 編號
  2. 名稱
  3. 年齡

要求:搜索基於名稱。這是所有員工都有唯一名稱的情況。它必須添加鍵爲id的對象。在極少數情況下,需要根據名稱進行搜索。

我做了什麼:

在我重寫的hashCode和equals方法的類。

我加入這些對象的列表到HashMap中與ID爲鍵和值作爲Employee對象

但同時增加或從一個HashMap這兩種方法不會被調用

那麼,什麼是搜索在hasmap方面使用這些方法?

Employee類

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. hashCode方法被調用僅當鍵是一個對象,並且該方法的關鍵類

2.等於(僱員EMP)內是否存在是造成過載的功能,而不是覆蓋。我應該用平等的(對象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; 
} 
+1

如果'id'是唯一屬性,不應該'hashCode'依據是不是叫什麼名字?而且,在作爲映射關鍵的對象上調用'hashCode'方法,即id,而不是值,即Employee。 – 2015-03-03 11:01:50

回答

2

您不重寫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; 
} 
+1

如果您使用equalsIgnoreCase進行等式檢查,則您的hashCode實現也必須不區分大小寫。 – 2015-03-03 16:56:37

0

我沒有測試,但

HashMap<Integer, Employee> empmap=new HashMap<>(); 

甚至

試試吧
HashMap<Integer, Employee> empmap=new HashMap<Integer, Employee>(); 
0

這可以在Java 8中使用流很好地完成。

empmap.values().stream().anyMatch(emp.getName().equals(searchedName)); 

這是以設置的所有條目的地圖,看看流匹配具有等於你searchedName名稱的任何條目。

在可比的,你也可以通過使用Stream.filter()

實現不同版本的平等的獲取所有匹配名稱/哈希碼是棘手的,因爲它改變了類在許多方面的行爲。

+1

...比'containsValue(o)'更大更復雜。順便說一句:我會使用'emp.values()。stream()....' – Christian 2015-03-03 11:02:49

+0

值的好點,我會相應地更新答案。 containsValue的問題在於它只允許使用equals,如果你改變了含義,那麼它有很多其他的含義。 – Thirler 2015-03-03 11:44:12

2

在我重寫的hashCode和equals方法的類。 [...] 但是,當從hashmap中添加或搜索時,這兩種方法都不會被調用 那麼這些方法在hasmap方面的用法是什麼?

如果你有Map<Key, Value>,和你打電話或putget地圖,然後hashCodeequals都呼籲Key類上,而不是在Value類。

就你而言,這意味着如果你做了empmap.put(emp1.getId(), emp1);那麼它會檢查散列emp1.getId()以及它是否已經在地圖中。所以這些方法在您的Employee類中不會被調用是正常的。

而且,如果id是「獨一無二」的屬性,然後Employee.hashCode可能應該基於這樣(和equals,也將符合hashCode),並在另一個答案指出,Employee.equals應該接受任何Object作爲參數。

0

問題的最簡單解決方案是將此方法添加到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; 
    } 

小心,平等的此實現(對象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)); 

真正 真正

相關問題