3

オーバーライドされた比較メソッドで (Person p2 = (Person) o2;) で ClassCastException が発生するのはなぜですか。:(

実際には、Person オブジェクトの代わりに、オーバーライドされた比較メソッドの値は「Jim」と「Jack」(キー値) として提供されます。だからキャストキャスト例外。しかし、値ではなくキー、つまり Person オブジェクトが付属しているのはなぜですか。なぜキーにのみ適用されるのですか。値に基づいて並べ替える他の方法はありますか。

間違っていたら訂正してください

1) それに応じてソートする TreeMap にコンパレータ オブジェクトを渡すことができます。

2) ソートは常に Keys に対して実行されます。?

3) コレクション オブジェクトを使用せずに Map をその値で並べ替えるにはどうすればよいですか (それは可能ですか)。また、デフォルトでサポートされていないのはなぜですか?

public class HashTableExamples {

/**
 * @param args
 */
public static void main(String[] args) {

    SortedMap persorSorted = new TreeMap(new Comparator() {

        @Override 
        public int compare(Object o1, Object o2) {
            Person p2 = (Person) o2;
            return 2;
        }
    });

    Person p = new Person(10);
    Person p1 = new Person(20);
    persorSorted.put("Jim", p);
    persorSorted.put("Jack", p1);
    Iterator sortedit = persorSorted.entrySet().iterator();
    while (sortedit.hasNext()) {
        Map.Entry pairs = (Map.Entry) sortedit.next();
        Person pw = (Person) pairs.getValue();
        System.out.println("From SortedMap : " + pw.getAge());
    }
}

public static class Person {
    Person(int agevalue) {
        this.age = agevalue;
    }

    private int age;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
4

2 に答える 2

1

TreeMapのドキュメントを見ると、次のように書かれていることがわかります。

指定されたコンパレータに従って並べ替えられた、新しい空のツリー マップを構築します。マップに挿入されるすべてのキーは、指定されたコンパレーターによって相互に比較可能でなければなりません: comparison.compare(k1, k2) は、マップ内のキー k1 および k2 に対して ClassCastException をスローしてはなりません。ユーザーがこの制約に違反するキーをマップに挿入しようとすると、put(Object key, Object value) 呼び出しで ClassCastException がスローされます。

ここでの要点は、keysを比較しているということですが、キー (つまり a String) を a にキャストしていますPerson

于 2013-01-29T03:46:45.113 に答える
1

はい、TreeMap常にキーでソートします。

「デフォルトでサポートされていない」理由については、それを効率的にサポートする一般的なデータ構造が存在しないためです。aのポイントはキーで物事を調べることができることであり、値でソートすると、効率的に物事を調べる方法でデータを整理できないことを意味するため、どのプログラミング言語でも効率的にサポートされていませんキー。Map

のエントリを値でソートする必要がある場合はMap、次のようなものを使用できます。

List<Map.Entry<Foo, Bar>> entryList = 
  new ArrayList<Map.Entry<Foo, Bar>>(map.entrySet());
Collections.sort(entryList, new Comparator<Map.Entry<Foo, Bar>>() {
  public int compare(Map.Entry<Foo, Bar> entry1, Map.Entry<Foo, Bar> entry2) {
    return entry1.getValue().compareTo(entry2.getValue());
  }
});

あるいは、必要に応じて、値の型の実装を制御しない場合は、別のコンパレータを使用して値を比較できます。

于 2013-01-29T03:47:53.610 に答える