2012-04-15 2 views
0

Ich habe eine Pojo namens Employee.java entwickelt. Jetzt plante ich, es als benutzerdefinierte Sammlung zu machen. Ich möchte eine Karte erstellen und alle Objekte des Mitarbeitertyps darin speichern.In Bezug auf Karte als benutzerdefinierte Basis

Unten ist mein 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; 
    } 


} 

Jetzt habe ich eine andere Klasse entwickelt, die Karte enthält und Mitarbeitertyp Objekte speichern ..

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()); 

     } 

aber wenn ich versuche, es zu laufen, ich will holen Sie die Angestelltdetails aber ich ERHALTEN ANGEZEIGT DAS OBJEKT AUF BILDSCHIRM ... Ich möchte den Angestellten Wert sehen, Bitte beraten Sie mich, wie man Werte vom Angestelltengegenstand erhält.

2 
S [email protected] 
S1 [email protected] 

Antwort

1

Sie benötigen die toString() Methode der Mitarbeiter

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

Ändern Sie diese in

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); 
} 

außer Kraft zu setzen Wie Sie mit der Linie

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

der Wert sehen kann, ist "Casted" zu einem Employee Objekt, und Sie können mit empl Variable arbeiten und alle Employee Klassenmethoden und Mitglieder verwenden.

3

Sie benötigen die toString Methode in der Klasse Employee, beispielsweise außer Kraft zu setzen:

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

By the way, können Sie ersetzen:

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

    } 

mit

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

Es sei denn, Sie möchten wirklich, dass die Ausgabe tab-separiert wird.

1

Zunächst einmal. Dein Hashcode ist kaputt. Versuchen Sie, diese:

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

Wenn Sie verwenden, und IDE (wie Eclipse) gibt es eine Funktion equals und hashCode Methoden automatisch zu generieren und Sie würden etwas wie diese:

@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; 
} 

Was Ihre Hauptmethode .. Sie sollten versuchen, einige Grundlagen über Generika zu lernen (das Zeug in der <>). Sie brauchen die Nity Grity Details nicht zuerst. Einfach lernen, wie man es mit Listen und Karten benutzt. Es wird dein Leben viel einfacher machen. Vor allem, da Ihr mit und IDE ...

Hier ist eine Refactoring-Version Ihrer Hauptmethode:

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

Hallo, ich habe nicht verstanden, wie die Hash-Code() gebrochen ist, expalin bitte im Detail ..! ! Ich habe diesen Hashcode() generiert, der Eclipse erzeugt aber wie er sich von meinem Hashcode() unterscheidet, bitte expalin detailliert. – Neera

+0

Ich habe auch überprüft, dass bei der Verwendung der Eclipse-Version es falsch ist, was perfekt ist, aber während meiner Verwendung ist es wahr, bitte erklären, was falsch in meiner Implementierung von Hash-Code() und wie es sich von Eclipse unterscheidet Hashcode() und was ist, wenn ich meinen eigenen Hashcode() für diese Klasse schreiben möchte, danke im Voraus. – Neera

+0

Ich habe noch nie gesehen, Eclipse Ihre Art von Hashcode zu generieren. Aber das Problem ist, dass (a + b) = (b + a). Wenn Sie einen Hashcode berechnen, müssen Sie die Reihenfolge der Felder berücksichtigen. Weitere Informationen finden Sie hier: http://www.technofundo.com/tech/java/equalhash.html – barsju