cmparator比较器问题

sinat_35134692 2017-03-17 08:24:04
public static void main(String[] args){
Scanner in=new Scanner(System.in);
while(in.hasNext()){
String str=in.nextLine();
char[] chr=new char[str.length()];
chr=str.toCharArray();
TreeSet<Character> ctr=new TreeSet<>(new Comparator<Character>(){
public int compare(Character ch1,Character ch2){
int cmp=ch1.compareTo(ch2);
if(cmp==0)
return 0;
else
return 1;
}
});
for(int i=str.length()-1;i>=0;i--)
ctr.add(chr[i]);
for(Character chp:ctr)
System.out.print(chp);
}
}
————————————————————————————————————————
输入12321,为什么输出是1231,最后一个1为什么进到了集合里?求解答
...全文
320 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sinat_35134692 2017-03-24
  • 打赏
  • 举报
回复
引用 7 楼 zs808 的回复:
问题产生的原因主要在于你规定了“所有不等于的都是大于”,加上二叉树的平衡修正,就导致这种结果出现了。 下面来逐步进行分析: 首先,put(1)时: 1 nil nil put(2)时: 1 nil 2 nil nil put(3)时: 1 nil 2 nil 3 nil nil 此时,1的右侧节点数量与左侧节点数量差值位2,大于1,所以需要进行旋转: 2 1 3 nil nil nil nil 接下来put(2),由于2与根节点相同,所以不执行任何操作,树结构不变。 接下来就是问题的关键了,你插入了1,因为你规定了“不相等的都是大于的”,所以1会往右侧走,然后结果就相当于你插入了4,然后把4替换成1,就是: 2 1 3 nil nil nil 1 nil nil 此时,进行先序遍历,就成了1231了。
非常感谢分析
zs808 2017-03-21
  • 打赏
  • 举报
回复
问题产生的原因主要在于你规定了“所有不等于的都是大于”,加上二叉树的平衡修正,就导致这种结果出现了。 下面来逐步进行分析: 首先,put(1)时: 1 nil nil put(2)时: 1 nil 2 nil nil put(3)时: 1 nil 2 nil 3 nil nil 此时,1的右侧节点数量与左侧节点数量差值位2,大于1,所以需要进行旋转: 2 1 3 nil nil nil nil 接下来put(2),由于2与根节点相同,所以不执行任何操作,树结构不变。 接下来就是问题的关键了,你插入了1,因为你规定了“不相等的都是大于的”,所以1会往右侧走,然后结果就相当于你插入了4,然后把4替换成1,就是: 2 1 3 nil nil nil 1 nil nil 此时,进行先序遍历,就成了1231了。
moguobiao 2017-03-21
  • 打赏
  • 举报
回复
http://baike.baidu.com/item/%E4%BA%8C%E5%8F%89%E6%8E%92%E5%BA%8F%E6%A0%91/10905079
sinat_37976067 2017-03-20
  • 打赏
  • 举报
回复
引用 4 楼 moguobiao 的回复:
[quote=引用 3 楼 sinat_35134692 的回复:] [quote=引用 2 楼 moguobiao 的回复:] 问题出在: if(cmp==0) return 0; else return 1; } 当1 和 2比较时,cmp<0。这里却返回1,就会得到1大于2的错误。这也是为什么最后一个1进到了集合里。
我不太理解,最后一个1进集合的时候难道不是要和第一个1进行比较么?[/quote] Tree 结构下,不一定。[/quote] 可以具体解释下么?Tree节点的增加过程,非常感谢
moguobiao 2017-03-19
  • 打赏
  • 举报
回复
引用 3 楼 sinat_35134692 的回复:
[quote=引用 2 楼 moguobiao 的回复:] 问题出在: if(cmp==0) return 0; else return 1; } 当1 和 2比较时,cmp<0。这里却返回1,就会得到1大于2的错误。这也是为什么最后一个1进到了集合里。
我不太理解,最后一个1进集合的时候难道不是要和第一个1进行比较么?[/quote] Tree 结构下,不一定。
sinat_35134692 2017-03-19
  • 打赏
  • 举报
回复
引用 2 楼 moguobiao 的回复:
问题出在: if(cmp==0) return 0; else return 1; } 当1 和 2比较时,cmp<0。这里却返回1,就会得到1大于2的错误。这也是为什么最后一个1进到了集合里。
我不太理解,最后一个1进集合的时候难道不是要和第一个1进行比较么?
moguobiao 2017-03-19
  • 打赏
  • 举报
回复
问题出在: if(cmp==0) return 0; else return 1; } 当1 和 2比较时,cmp<0。这里却返回1,就会得到1大于2的错误。这也是为什么最后一个1进到了集合里。
sinat_35134692 2017-03-18
  • 打赏
  • 举报
回复
求助大神分析

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧