3

为什么在覆盖的比较方法中在 (Person p2 = (Person) o2;) 处出现 ClassCastException。:(

实际上,比较覆盖方法中的值不是 Person Object,而是以“Jim”和“Jack”(键值)的形式出现。所以 Cast Cast Exception 。但是为什么它带有键而不是值,即 Person 对象,为什么它只适用于键。有没有其他方法可以根据值对其进行排序。

如果错了请纠正我

1) 我们可以在 TreeMap 中传递比较器对象,它会相应地对其进行排序。?

2)总是在 Keys 上执行排序。?

3)我们如何在不使用集合对象的情况下对 Map 的值进行排序(是否可能),为什么默认不支持?

公共类 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 的文档,您会看到它说:

构造一个新的空树映射,根据给定的比较器排序。插入到映射中的所有键必须通过给定的比较器相互比较:comparator.compare(k1, k2) 不能为映射中的任何键 k1 和 k2 抛出 ClassCastException。如果用户试图将违反此约束的键放入映射中,则 put(Object key, Object value) 调用将抛出 ClassCastException。

这里的要点是它正在比较keys,但是您将 key (即: a String)转换为 a Person

于 2013-01-29T03:46:45.113 回答
1

是的,TreeMap总是按键排序。

至于为什么它不是“默认支持” - 这是因为通常不存在有效支持它的数据结构。它在任何编程语言中都没有得到有效支持,因为 aMap的目的是能够通过键查找内容,而按值排序意味着您无法以一种高效的方式来组织数据键。

如果您必须Map按值对 a 的条目进行排序,则可以使用以下内容:

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 回答