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

追加している3つのEmployeeオブジェクトすべてが異なるハッシュコードを持っているにもかかわらず、ツリーマップ「tree」に従業員オブジェクト「Pad」の要素が1つしかない理由を教えてください。equals / hashcodeをオーバーライドしていないためですか?はいの場合-すべてが異なるハッシュコードを返すのになぜオーバーライドする必要があるのか​​あなたの考えをいただければ幸いです。ありがとう

4

2 に答える 2

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

これは、2人の人の名前と名前が同じである場合、それらは等しいということです。区別するために、個人IDフィールドを用意することをお勧めします。

Setしたがって、別のインスタンスを追加しようとすると、Keyofにすでに追加されているのと同じインスタンスであることがわかります。Map

compareToの実装を適切にし、 equals()メソッドもオーバーライドします

于 2012-06-12T09:09:10.213 に答える
3

問題は、オブジェクトをツリーマップに配置するときに、treeMapがemployee.comparedToメソッドを使用して、新しいキーを入力しているかどうかを確認することです。毎回0を返すようにcompareToメソッドを定義しているため(つまり、2つのオブジェクトが同じである)、treeMapは、treeMap.putを呼び出すたびに、異なるEmployee値を同じキーオブジェクトとペアリングしていると見なします。compareToを変更して-1、またはオブジェクトの順序を反映する適切な値を返すと、treeMap.size()は3を返します。

于 2012-06-12T09:24:19.497 に答える