SortedMap与Comparator ClassCast异常

时间:2013-01-29 03:43:08

标签: java sorting map sortedmap

为什么在重写的比较方法中(Person p2 =(Person)o2;)得到ClassCastException。 :(

实际上,而不是人物对象,比较被覆盖方法中的值将来自" Jim"和杰克" (关键值)。所以Cast Cast Exception。但是为什么它带有键而不是值i,即Person对象,为什么它只适用于键。有没有其他方法可以根据值对其进行排序。

如果错了,请纠正我

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

2)始终通过Keys执行排序。 ?

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

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

2 个答案:

答案 0 :(得分:1)

如果您查看documentation for TreeMap,您会看到它:

  

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

这里的要点是,它正在比较,但您正在将密钥(即:String)投射到Person中。

答案 1 :(得分:1)

是的,TreeMap总是按键排序。

至于为什么它不是“默认支持” - 这是因为通常不存在有效支持它的数据结构。 任何编程语言都不能有效支持它,因为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());
  }
});

或者,如果您愿意,如果您不控制值类型的实现,则可以使用备用比较器来比较值。

相关问题