TreeSet:去重与排序
方法1、
TreeSet同样在存储字符串时会自动对字符串进行排序与排序
但对于存储对象元素的集合来说还是需要我们自定义规则,再根据规则重写方法进行排序
TreeSet存储字符串自动实现排序的原理:
在往集合添加元素时,add()方法调用了字符串的compareTo方法
compareTo方法时来自于Comparable接口,并按照字典顺序比较两个字符串
注:默认是升序并且是按照字典排序
解释下字典顺序:
* 字典顺序:按照ASCII表比较当前的两个字符,ASCII码大的认为是大的字符
* 规则:从左边第一个字符开始比较
* 如果当前的字符不相同,直接认为ASCII大的字符串是大字符串,后面的字符停止比较
* 当前字符比较的具体规则:使用前面的字符-后面的字符,返回差值.如果是负数,说明前面的字符串小于后面的.反之前面的大.
* 如果当前的字符相同,再去比较第二个字符,依次往后推,如果比到最后都相同,则认为两个字符串相等,差值返回0.
所以和上面一样,我们同样要重写对应的方法来排序,我们要重写compareTo()方法
建类实现Comparable接口
class Person implements Comparable{
String name;
int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
//重写compareTo方法
//按照姓名和年龄比较,只要姓名和年龄相同就认为是同一个人
public int compareTo(Object obj){
//首先进行容错处理
if(!(obj instanceof Person)){
throw new ClassCastException();
}
//向下转型
Person person=(Person)obj;
//先按照年龄比,年龄相同再按照姓名比
int num=age-person.age;
return num==0?name.compareTo(person.name):num;
}
public static void main(String[] args) {
//实例:将Person的对象存储入TreeSet,实现排序和去重
TreeSet set1 = new TreeSet<>();
set1.add(new Person("bobo", 20));
set1.add(new Person("bobo", 18));
set1.add(new Person("bobo3", 200));
set1.add(new Person("bobo5", 20));
set1.add(new Person("bobo", 20));
System.out.println(set1);
}
}
方法2、
TreeSet的第二种排序方式:使用实现了Comparator接口的比较器对象实现比较
总结:对TressSet的排序有两种方式:
1、实现Comparable接口的compareTo方法---系统排序
2、实现Comparetor接口的compare方法---人工排序
系统让人工排序的优先级高于系统排序,方便人工排序的实现
实例:实现将字符串按照从短到长排序,长度相同按照字典排序
//创建比较器
class ComWithLength implements Comparator{
public int compare(Object o1,Object o2){ //首先进行容错处理
if(!(o1 instanceof String)){
throw new ClassCastException("类型转换错误");
}
if(!(o2 instanceof String)){
throw new ClassCastException("类型转换错误");
}
//向下转型
String s1=(String)o1;
String s2=(String)o2; //字符串按照从短到长排序,长度相同按照字典排序
int num=s1.length()-s2.length();
return num==0?s1.compareTo(s2):num;
}
}
public static void main(String[]args){ //创建一个比较器对象
ComWithLength comWithLength = new ComWithLength(); //将比较器对象传给当前的TreeSet对象
TreeSet set=new TreeSet<>(comWithLength);
set.add("java1ttt");
set.add("java4");
set.add("java3kk");
set.add("java1");
System.out.println(set);
}