TreeSet<Integer> ts = new TreeSet<>();
TreeSet<Integer> ts = new TreeSet<>();
ts.add(2);
ts.add(3);
ts.add(1);
System.out.println(ts);
输出结果默认有序
TreeSet<String> ts = new TreeSet<>();
ts.add("abb");
ts.add("aab");
ts.add("ab");
System.out.println(ts);
这里的比较规则,是根据底层的字符串自己的比较规则来进行排序的,首先比较第一位,谁小谁在前,后面一次比较其他位置数据,比较的值是根据对应字符在Ascall码表的值来比较的。
public class Student {
public String name;
public int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public static void main(String[] args) {
TreeSet<Student> ts = new TreeSet<>();
ts.add(new Student("zhangsan", 5));
ts.add(new Student("wangwu", 2));
ts.add(new Student("lisi", 4));
System.out.println(ts);
}
注意:运行报错
原因: 因为TreeSet底层是采用黑红树的数据结构来进行存储数据,但是这种数据进行存储的时候,必须要是可以进行比较的数据才可以,这边的自定义数据类型,并不能进行谁大谁小的比较,所以会报错。
直接继承Comparable结构,重写compareTo方法来实现比较规则--这边是采用比较年龄大小来进行区分
public class Student implements Comparable<Student>{
public String name;
public int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Student s) {
return this.age - s.age;
}
}
再次运行代码
成功输出结果,并且得到升序的数据
TreeSet<Student> ts = new TreeSet<>();
ts.add(new Student("zhangsan", 5));
ts.add(new Student("wangwu", 2));
ts.add(new Student("lisi", 4));
ts.add(new Student("zhaoliu", 4));
System.out.println(ts);
可以从输出结果看出来尽管用户名不用,但是age相同也会触发相同数据不添加。原因是重写的compareTo方法里面是通过age来比较大小的。
在对字符串进行比较的时候,它默认是根据自己的规则来进行排序的,但是我目前不相通过它自己的规则,但是有不能改它的源码,所以现在就可以采用第二种规则来进行。(这边的规则设定为,根据字符串的长度来判断,要是长度一样就说明重复)
默认情况:
TreeSet<String> ts = new TreeSet<>();
ts.add("abcd");
ts.add("ab");
ts.add("add");
ts.add("ab");
System.out.println(ts);
没有安装需要的方式来进行-现在使用新方式,自定义排序规则
TreeSet<String> ts = new TreeSet<>(new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
int i1 = s1.length();
int i2 = s2.length();
return i1 - i2;
}
});
ts.add("abcd");
ts.add("ab");
ts.add("add");
ts.add("ab");
System.out.println(ts);
结果完成预期效果
简写代码:
TreeSet<String> ts = new TreeSet<>((s1, s2) -> s1.length() - s2.length());
ts.add("abcd");
ts.add("ab");
ts.add("add");
ts.add("ab");
System.out.println(ts);
完成最终效果
评论
登录后才可以进行评论哦!