黑马程序员技术交流社区

标题: 用TreeSet给字符串去重遇到个问题,求大神帮帮忙解释!! [打印本页]

作者: 周军福    时间: 2016-9-20 23:46
标题: 用TreeSet给字符串去重遇到个问题,求大神帮帮忙解释!!
需求:给一个字符串去重,并且不改变元字符串的顺序。{:2_31:}
我的程序是:
public class Test1_TreeSet {

        public static void main(String[] args) {
                String  s ="abcacd";
               
                TreeSet<Character>  ts =  new TreeSet<>(new Comparator<Character>() {//s树形集合,创建comparator匿名内部类
                        public int compare(Character c1,Character c2){
                        return c1.compareTo(c2) == 0?c1.compareTo(c2):1;//两个元素相同时返回0,让其只存一个,当两者不同时返回为1,保证顺序不变
                        }
                });
                char[] arr = s.toCharArray();//将字符串转为字符数组
                for (char c : arr) {//遍历数组,把每一个值存入集合中,得到不重复的集合
                        ts.add(c);
                }
                System.out.println(ts);

              }
}

打印输出结果是:[a, b, c, a, d]

作者: 周军福    时间: 2016-9-21 10:25
没人回复
作者: 周军福    时间: 2016-9-21 10:31
我来回复
作者: 周军福    时间: 2016-9-21 10:49
依旧如此
作者: 黑马豹仔    时间: 2016-9-21 14:09
set无序的
作者: 嬉笑    时间: 2016-9-21 14:19
在来一个for(Character  c : ts){
              System.out.println(c);
}
作者: 周军福    时间: 2016-9-21 15:17
爱我中华
作者: 回根的落叶    时间: 2016-9-21 17:19
字符串去除重复字母,并且按照字典顺序输出。不需要传入比较器。直接使用TreeSet集合就可以了。如果实在要用比较器,重写compare方法时,应该是:
[Java] 纯文本查看 复制代码
return o1.compareTo(o2) == 0 ? 0 : o1.compareTo(o2); //o1与o2相等时不添加,不等时就直接按照相比较的结果存入即可。如果写死成1,那也就是说不管o1大还是o2大,都是按照o1在前o2在后的顺序存储


作者: luchatex    时间: 2016-9-21 20:46
回根的落叶 发表于 2016-9-21 17:19
字符串去除重复字母,并且按照字典顺序输出。不需要传入比较器。直接使用TreeSet集合就可以了。如果实在要 ...

比较为何不用 equals?
作者: gcno93    时间: 2016-9-21 22:18
不需要比较器,直接放进去就好了原因是Character已经实现了comparable接口
作者: daikaisheng    时间: 2016-9-21 22:51
return c1.compareTo(c2) == 0 ? 1 : c1.compareTo(c2);   
作者: mqxin    时间: 2016-9-21 22:57
用LinkedHashSet能一步到位,去重且不打乱顺序

作者: 周军福    时间: 2016-9-22 23:40
可以了11!
作者: Array先生    时间: 2016-9-23 07:44
[Java] 纯文本查看 复制代码
import java.util.LinkedHashSet;
import java.util.Set;


//需求:给一个字符串去重,并且不改变元字符串的顺序。
//我的程序是:
public class Demo01 {
        public static void main(String[] args) {
                String  s ="abcacd";
               
                Set<Character> s1 = new LinkedHashSet<Character>();
        char[] arr = s.toCharArray();//将字符串转为字符数组
        for (char c : arr) {
                        s1.add(c);
                }
        
        System.out.println(s1);
  }
}

//打印输出结果是:[a, b, c, ,d]

作者: litianji2016    时间: 2016-9-23 12:08
没看明白?
作者: xuezhangjun    时间: 2016-9-23 23:22
解决了吗?怎么接的呢?
作者: 周军福    时间: 2016-9-24 00:56
解决不了
作者: 读书可以当饭吃    时间: 2016-9-24 01:28
没看懂怎么回事
作者: chensc    时间: 2016-9-24 09:35
学习学习!
作者: 周军福    时间: 2016-9-24 18:53
一天又一天
作者: 周军福    时间: 2016-9-26 01:38
不对!!!
作者: chensc    时间: 2016-9-26 06:35
学习学习!
作者: 周军福    时间: 2016-9-27 02:37
键盘敲烂,月薪过万
作者: chensc    时间: 2016-9-27 06:28
学习学习!
作者: 545818406    时间: 2016-9-27 10:15
多练~~~~~
作者: 836563696    时间: 2016-10-15 15:56
回根的落叶 发表于 2016-9-21 17:19
字符串去除重复字母,并且按照字典顺序输出。不需要传入比较器。直接使用TreeSet集合就可以了。如果实在要 ...

大哥,你题目都没看清,就是要求不改变顺序,不是要你按字典排序,字典排序哪用得着传比较器
作者: z443863517    时间: 2016-10-15 15:58
return c1.compareTo(c2) == 0?c1.compareTo(c2):1;  这里写反了
作者: 836563696    时间: 2016-10-15 15:59
mqxin 发表于 2016-9-21 22:57
用LinkedHashSet能一步到位,去重且不打乱顺序

我拿到的这个题目是要求你用TreeSet给一个字符串去重,并且不改变元字符串的顺序.
结果和楼主一样,去重有的去了,有的没去.
作者: 836563696    时间: 2016-10-15 16:00
周军福 发表于 2016-9-22 23:40
可以了11!

你用treeset做出来了?分享一下代码
作者: 836563696    时间: 2016-10-15 16:02
Array先生 发表于 2016-9-23 07:44
[mw_shl_code=java,true]import java.util.LinkedHashSet;
import java.util.Set;

关键在于题目要求用treeset......




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2