是因为要添加的对象需要实现 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必须有严格的比较器才能正确
的使用,多加一句,你可以使用泛型<>,省去很多的强制转换.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)