题目描述题目来源及自己的思路我的程序里声明了一个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,theelementsarethesameif(this.name.equals(p.getName())&&p.getAge()==this.age){System.out.println(name+"..."+age);return0;}elsereturn1;}}你期待的结果是什么?实际看到的错误信息又是什么?
2 回答
DIEA
TA贡献1820条经验 获得超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中只会有两个元素。
添加回答
举报
0/150
提交
取消