java - 从 Treemap 获取带有 id 的对象会引发异常

标签 java dictionary

我想创建一个排序的 map 。我使用下面的代码创建了一个 map ,首先我检查了该对象并将该对象添加到列表中。但是当我尝试检查第二个对象时,它给出了 ClassCastException。

java.lang.ClassCastException: java.lang.String cannot be cast to myapplication.Student

这是我的代码;

Map students = new TreeMap(new Comparator<Student>() {
    @Override
    public int compare(Student s1, Student s2) {
        if(s1.getName() == null || s2.getName() == null){
            return -1;
        }
        return s1.getName().compareTo(s2.getName());
    }
});


Student student = (Student) students.get("23123");
if (student == null) {
    student= new Student("321312", "sfsfsfs");
    students.put("23123", student);
}

Student student2 = (Student) students.get("42131");//this line throws exception
if (student2 == null) {
    student2 = new Student("421321", "dgdfs");
    students.put("42131", student2);
}

我的Student.java类;

public class Student {

    private String name;
    private String number;

    //const, getters and setters.

}

最佳答案

TreeMap中,Comparator是比较键而不是值。第一个 getput 成功,因为 map 是空的,不需要调用比较器。但是第二个get需要比较器将 key 与现有 key 进行比较。您的输入键是 String 类型,而比较器将其处理为 Student 类型。然后抛出一个ClassCastException

将您的 map 声明为:

Map<String, Student> students = new TreeMap<String, Student>();

然后就可以了。请注意,您不需要为 String 键类型提供 Comparetor,因为 String 已经是Comparable

关于java - 从 Treemap 获取带有 id 的对象会引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21672553/

相关文章:

java - 使用java更改unix文件的组

java - 在路径中包含 Java 7 的服务器上使用 Play Framework 2.4+

c++ - std::map 返回后值丢失

python - 为什么 globals() 在迭代期间改变大小?

function - 如何使用函数作为 map 的键

java - 无法执行目标 org.apache.maven.plugins :maven-compiler-plugin:2. 3.2:compile (default-compile)

java - 我应该更喜欢代码复制以获得更好的性能吗?

java - 如何将 PDF 文件附加到邮件中

C:从带有链表和哈希表的txt文件实现的字典无法找到文件中存在的单词

python - 如果列包含项目,如何用数据框列替换列表中的项目