treeset集合里添加元素报类型转换异常

treeset集合里添加元素报类型转换异常,第1张

报此异常

是因为要添加的对象需要实现 comparable接口

并且重写comparato方法

但是往Hashset方法里添加对象元素就不需要实现comparable接口,就可以直接添加对象.因为

public class Test1 {

public static void main(String[] args) {

// --测式加入TreeSet并排序-------------

Set<Student> set = new TreeSet<Student>()

addTestData(set)

printData(set)

// --测式加入HashSet无序-------------

set = new HashSet<Student>()

addTestData(set)

printData(set)

}

public static void addTestData(Set set) {

Student s1 = new Student("d_name1", 30)

Student s2 = new Student("a_name2", 20)

Student s3 = new Student("c_name3", 26)

Student s4 = new Student("b_name4", 24)

Student s5 = new Student("c_name1", 30)

Student s6 = new Student("c_name1", 30)

System.out.println(set.add(s1) == true ? "加入" : "重复")

System.out.println(set.add(s2) == true ? "加入" : "重复")

System.out.println(set.add(s3) == true ? "加入" : "重复")

System.out.println(set.add(s4) == true ? "加入" : "重复")

System.out.println(set.add(s5) == true ? "加入" : "重复")

System.out.println(set.add(s6) == true ? "加入" : "重复")

}

public static void printData(Set set) {

for (Iterator<Student> iterator = set.iterator() iterator.hasNext()) {

Student student = iterator.next()

System.out.println(set.getClass().getName() + " 姓名:" + student.name

+ " 年龄:" + student.age)

}

}

}

class Student implements Comparable {

int age

String name

Student(String name, int age) {

this.age = age

this.name = name

}

public boolean equals(Object obj) {

Student s = (Student) obj

return (age == s.age && name.equals(s.name))

}

public int hashCode() {

return age * name.hashCode()

}

public int compareTo(Object obj) {

Student stu = (Student) obj

//先按年龄排,后按姓名排

int num = new Integer(this.age).compareTo(new Integer(stu.age))

return num == 0 ? this.name.compareTo(stu.name) : num

}

}

说真的,你这么多的代码让别人帮你看,却没分

别人怎么又动力,不过咱们这种命苦的就算了,权当作是锻炼

你程序里面有个地方写的很精妙,我喜欢!!!!

return p1.whole<p2.whole?1:p1.whole<p2.whole?-1:0

可惜这正是你的程序出差错的地方

稍微修改一下

return p1.whole<p2.whole?1:p2.whole<p1.whole?-1:0

另外我从api上c了点资料:

如果要正确实现 Set 接口,则 set 所维护的顺序(是否提供了显式比较器)必须为与等号一致(请参阅与等号一致 精确定义的 Comparable 或 Comparator)。这是因为 Set 接口根据 equals *** 作进行定义,但 TreeSet 实例将使用其 compareTo(或 compare)方法执行所有的键比较,因此,从 set 的角度出发,该方法认为相等的两个键就是相等的。即使 set 的顺序与等号不一致,其行为也是 定义良好的;它只是违背了 Set 接口的常规协定。

你那个类型比较器是错误,混乱的,而TreeSet必须有严格的比较器才能正确

的使用,多加一句,你可以使用泛型<>,省去很多的强制转换.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11605179.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存