萌新!我的代码中是声明一个 Tree Set 对象,结果发现加入了“相同”元素。请问是为什么谢谢哈~

题目描述
题目来源及自己的思路
我的程序里声明了一个TreeSet对象ts,写了一个学生类,当学生的年龄和姓名相同时被认为是相同元素。在ts中添加了第一个学生对象与最后一个学生对象时,使这俩个学生对象的姓名和年龄相同,打印结果发现这俩个元素均被输出,ts大小为4。
相关代码
importjava.util.TreeSet;publicclassTreeSetDemo{
publicstaticvoidmain(String[]args){
TreeSetts=newTreeSet<>();
ts.add(newStudent("lisi02",22));
ts.add(newStudent("lisi01",40));
ts.add(newStudent("lisi08",19));
ts.add(newStudent("lisi02",22));
//thefirstelementandthelastoneareaddedtots
//However,tsbelongstoaSetCollection.
//SoIthinkthelastoneshouldnotbeaddedtots.
//whenthesecondelementisannotated,thelastonecannotbeadded.
//Canyouexplainwhy?
for(Studente:ts){
System.out.println(e.getName()+"\t...\t"+e.getAge());
}
System.out.println(ts.size());
}
}
classStudentimplementsComparable{
privateStringname;
privateintage;
Student(Stringname,intage){
this.name=name;
this.age=age;
}
publicStringgetName(){
returnname;
}
publicintgetAge(){
returnage;
}
publicintcompareTo(Objectobj){
if(!(objinstanceofStudent))
thrownewRuntimeException("NotStudentclass");
Studentp=(Student)obj;
//Whennameandagearethesame,theelementsarethesame
if(this.name.equals(p.getName())&&p.getAge()==this.age){
System.out.println(name+"..."+age);
return0;
}else
return1;
}
}
你期待的结果是什么?实际看到的错误信息又是什么?
翻翻过去那场雪
浏览 355回答 2
2回答

喵喵时光机

你的compareTo方法返回0或1,返回0的时候新value替换旧value,返回1的时候,则作为子节点添加到红黑树的右边。ts.add(newStudent("lisi02",22));ts.add(newStudent("lisi01",40));ts.add(newStudent("lisi08",19));ts.add(newStudent("lisi02",22));如果代码是这样的,当你添加完第三个元素lisi0819的时候,红黑树会进行旋转操作,旋转完root节点是lisi0140,左子节点为lisi0222,右子节点为lisi0819,当你添加第四个元素时候,只会和lisi0140和lisi0819进行比较,因为你的compareTo方法不存在-1的返回值。所以ts中会保存第四个元素。ts.add(newStudent("lisi02",22));//ts.add(newStudent("lisi01",40));ts.add(newStudent("lisi08",19));ts.add(newStudent("lisi02",22));当你把第二个元素注释掉,添加完lisi0222和lisi0819之后,红黑树不需要旋转,root节点是lisi0222,右子节点为lisi0819,当你添加最后一个lisi0222的时候是会和第一个lisi0222进行比较的。所以ts中只会有两个元素。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript