2012-06-12 2 views
2
public class BigD{ 
    public static void main(String[] args) { 


     List<Employee> emps = new ArrayList<Employee>(); 
     emps.add(new Employee("Bal", "5")); 
     emps.add(new Employee("Kiri", "7")); 
     emps.add(new Employee("Pad", "2")); 

     Map tree = new TreeMap(); 
     for(int i=0; i<emps.size(); i++) { 
      Employee emp = null; 
      emp = emps.get(i); 
      System.out.println("hashcode : " + emp.hashCode()); 
      tree.put(emp, emp.getFirstNM()); // why is not keeping all three elements here ? 
     } 
     System.out.println(tree.size()); //why does it print the size as "1" 
    } 
} 

class Employee implements Comparable { 
    private String firstNM; 
    private String lastNM; 

    Employee(String firstNM, String lastNM) { 
     this.firstNM = firstNM; 
     this.lastNM = lastNM; 
    } 

    public String getFirstNM() { 
     return firstNM; 
    } 
    public void setFirstNM(String firstNM) { 
     this.firstNM = firstNM; 
    } 
    public String getLastNM() { 
     return lastNM; 
    } 
    public void setLastNM(String lastNM) { 
     this.lastNM = lastNM; 
    } 

    public int compareTo(Object o) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 
} 

Пожалуйста, дайте мне знать Почему treemap «tree» имеет только один элемент, который имеет объект-сотрудник «Pad», хотя все три объекта Employee, которые я добавляю, имеют разные хэш-коды. Это из-за того, что я не являюсь основным символом/hashcode? если да - почему я должен переопределять, когда все возвращают разные хэш-коды Ваши мысли будут оценены. БлагодаряTreeMap - почему он возвращает размер только один, даже после добавления в него более двух элементов?

ответ

3

Проблема заключается в том, что когда вы положили предметы в TreeMap, то TreeMap использует метод employee.comparedTo для посмотрите, вводите ли вы новый ключ. Поскольку метод compareTo для каждого метода возвращает 0 (это означает, что оба объекта одинаковы), treeMap будет думать, что вы каждый раз вызываете treeMap.put, чтобы вы сопоставляли разные значения Employee с одним и тем же ключевым объектом. Если вы измените compareTo на возврат -1 или соответствующее значение, отражающее порядок объектов, то treeMap.size() вернется 3.

+0

Спасибо за ответы. Теперь я понятен –

9

Поскольку сравнивать каждый объект же в compareTo() методы

public int compareTo(Object o) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

Сделать это как

public int compareTo(Object o) { 
     return ((this.getFirstName() + this.getLastName()).compareTo((o.getFirstName() + o.getLastName()))); 
} 

Это сказать, что если два человека есть такие же ПгвЬЫат и фамилия, то они равны, Я бы порекомендовал вам иметь поле идентификатора человека для дифференциации

Поэтому, когда он попытается добавить еще один экземпляр, он будет считаю, что это тот же экземпляр уже добавлен в Key Set из Map

реализации CompareTo сделать надлежащий также переопределить метод equals()

+1

Я бы хотел проголосовать дважды дважды –

Смежные вопросы