2012-04-15 52 views
0

我開發了一個名爲Employee.java的pojo。現在我打算將它作爲用戶定義的集合。我想製作一張地圖並將所有員工類型對象存儲在其中。關於地圖作爲用戶定義的基地

下面是我的POJO

public class Employee {  
    String name,job; 
    int salary; 


    public Employee(String n , String j, int t) //constructor 
    { 
     this.name= n; 
     this.job=j; 
     this.salary= t; 

    } 

    @Override 
    public int hashCode() 
    {  
     return name.hashCode()+job.hashCode()+salary;  

    } 
    @Override 
     public boolean equals(Object obj) { 

     Employee e = (Employee) obj; 
     return this.name.equals(e.name)&&this.job.equals(e.job)&&this.salary==e.salary; 
    } 


} 

現在,我已經開發了包含地圖,並且將商店僱員類型的對象..

public static void main(String[] args) 
     {   
     Map employeeMap = new HashMap(); 
     Employee e = new Employee("Saral", "Trainer", 34000); 
     Employee e1 = new Employee("Sarall", "saral", 34090); 
     employeeMap.put("S", e); 
     employeeMap.put("S1", e); 
     System.out.println(employeeMap.size()); 
     Set s = employeeMap.entrySet(); 

     Iterator it = s.iterator(); 
     while(it.hasNext()) 
     {   
      Map.Entry m =(Map.Entry)it.next(); 
      System.out.println(m.getKey()+"\t"+m.getValue()); 

     } 

但是當我嘗試運行它,我想另一個類獲取員工詳細信息,但我在屏幕上顯示了對象...我想查看員工價值,請告訴我如何從員工對象獲取價值。

2 
S [email protected] 
S1 [email protected] 

回答

1

你需要重寫員工

toString()方法
@Override pulic String toString() { 
    return name + " " + job; 
} 
0

變化這

Iterator it = s.iterator(); 
while(it.hasNext()) 
{   
    Map.Entry m =(Map.Entry)it.next(); 
    Employee empl = (Employee) m.getValue(); 
    System.out.println(m.getKey()+"\t"+empl.name); 
} 

你可以用線

Employee empl = (Employee) m.getValue(); 

值看「鑄造」到Employee對象,並且您可以開始使用empl變量並使用所有Employee類方法和成員。

3

你需要重寫toString方法在Employee類,例如:

public String toString() { 
    return name + " [" + job + "] - salary: " + salary; 
} 

順便說一句,你可以替換:

Iterator it = s.iterator(); 
    while(it.hasNext()) 
    {   
     Map.Entry m =(Map.Entry)it.next(); 
     System.out.println(m.getKey()+"\t"+m.getValue()); 

    } 

System.out.println(s.toString()); 

除非你真的希望輸出是製表符分隔。

1

首先。您的散列碼已損壞。 嘗試運行此:

 System.out.println("Should be false: " + (new Employee("Sara", "Trainer", 1).hashCode() == new Employee("Trainer", "Sara", 1).hashCode())); 

如果使用的是與IDE(如Eclipse)有自動生成equals和hashCode方法的功能,你會得到這樣的:

@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + ((job == null) ? 0 : job.hashCode()); 
    result = prime * result + ((name == null) ? 0 : name.hashCode()); 
    result = prime * result + salary; 
    return result; 
} 



@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    Employee other = (Employee) obj; 
    if (job == null) { 
     if (other.job != null) 
      return false; 
    } else if (!job.equals(other.job)) 
     return false; 
    if (name == null) { 
     if (other.name != null) 
      return false; 
    } else if (!name.equals(other.name)) 
     return false; 
    if (salary != other.salary) 
     return false; 
    return true; 
} 

至於你的主要方法..你應該嘗試學習一些關於泛型的基礎知識(<>內的東西)。一開始你不需要太多的細節。只要學習如何與列表和地圖一起使用它,它會讓你的生活變得更加輕鬆。特別是由於您的使用和IDE ...

這裏是你的主要方法的重構版本:

public static void main(String[] args) 
    {   
     Map<String, Employee> employeeMap = new HashMap<String, Employee>(); 
     Employee e = new Employee("Saral", "Trainer", 34000); 
     Employee e1 = new Employee("Sarall", "saral", 34090); 
     employeeMap.put("S", e); 
     employeeMap.put("S1", e1); 
     System.out.println(employeeMap.size()); 
     Set<Entry<String, Employee>> entrySet = employeeMap.entrySet(); 
     for (Entry<String, Employee> entry: entrySet) { 
      System.out.println(entry.getKey()+"\t"+entry.getValue().name); 
     } 

     System.out.println("Should be false: " + (new Employee("Sara", "Trainer", 1).hashCode() == new Employee("Trainer", "Sara", 1).hashCode())); 
    } 
+0

嗨,我聽不懂的hashCode()方法是怎麼壞了,請expalin詳細..! !我已經生成了eclipse生成的hashcode(),但它與mine hashcode()不同,請詳細說明。 – Neera 2012-04-15 17:36:09

+0

我也檢查過在使用eclipse的時候它會出現錯誤,這是完美的,但是在使用它的時候它會變成真實的,請解釋我的哈希代碼()的實現錯誤以及它如何與eclipse生成的不同hashcode()以及如果我想爲這個類編寫自己的hashcode(),那麼提前感謝。 – Neera 2012-04-15 17:39:12

+0

我從來沒有見過eclipse生成你的那種散列碼。但問題是(a + b)=(b + a)。因此,在計算哈希碼時,您必須考慮字段的順序。有關更多詳細信息,請參見此處:http://www.technofundo.com/tech/java/equalhash.html – barsju 2012-04-15 17:41:16