自定义类型存储
,如Student和Teacher类型数据等,由于这些
自定义的类型的数据没有实现Comparable接口,因此无法直接在TreeSet集合中进行排序操作
。
解决方案,Java提高了两种TreeSet的排序规则**,自然排序**(默认情况下,TreeSet集合采用自然排序)和
定制排序
-
自然排序
自然排序要求TreeSet集合中存储的元素所在的
类必须实现Comparable接口,并重写comoareTo()方法
,然后TreeSet集合就会对该类型使用compareTo()方法进行比较,并默认进行升序排序
package com.sgl;
import java.util.TreeSet;
//定义Teacher类实现Comparable接口
class Teacher implements Comparable {
String name;
int age;
public Teacher(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return name + ":" + age;
}
@Override
public int compareTo(Object obj) {
Teacher s = (Teacher) obj;
//定义比较方式,先比较年龄age,在比较名称name
if (this.age - s.age > 0) {
return 1;
}
if (this.age - s.age == 0) {
return this.name.compareTo(s.name);
}
return -1;
}
}
public class Test {
public static void main(String[] args) {
TreeSet<Object> ts = new TreeSet<>();
ts.add(new Teacher("Jack", 19));
ts.add(new Teacher("Rose", 18));
ts.add(new Teacher("Tom", 19));
ts.add(new Teacher("Rose", 18));
System.out.println(ts);
}
}
运行结果:
[Rose:18, Jack:19, Tom:19]
- 定制排序
TreeSet集合中的字符串可以
按照长度
而不是英文字母来进行排序,可以通过在创建TreeSet集合是就
自定义一个比较器来对元素进行定制排序。
按字符串长度排序,如下:
package com.sgl;
import java.util.Comparator;
import java.util.TreeSet;
class MyComparator implements Comparator{
@Override
public int compare(Object obj1, Object obj2) { //定制排序方式
String s1 = (String) obj1;
String s2 = (String) obj2;
int temp = s1.length() - s2.length();
return temp;
}
}
public class Test {
public static void main(String[] args) {
//创建集合时,传入Comparator接口实现定制排序规则
TreeSet<Object> ts = new TreeSet<>(new MyComparator());
ts.add("Jack");
ts.add("Helena");
ts.add("Eve");
System.out.println(ts);
//创建集合,使用Lambda表达式定制排序规则
TreeSet<Object> ts2 = new TreeSet<>((obj1, obj2) -> {
String s1 = (String) obj1;
String s2 = (String) obj2;
return s1.length() - s2.length();
} );
ts2.add("Jack");
ts2.add("Helena");
ts2.add("Eve");
System.out.println(ts2);
}
}
运行结果:
[Eve, Jack, Helena]
[Eve, Jack, Helena]
简述:
使用TreeSet集合的
public TreeSet(Comparator <? super E>comparator)有参构造方法
,分别传入
Comparable接口实现类MyComparator以及Lambda表达式两种参数
方式创建了定制排序规则的TreeSet集合。
注意:在使用TreeSet集合存储数据时**,TreeSet集合会对存入元素进行比较排序**,所以为了保证程序的正常运行,
一定保证存入TreeSet集合中的元素是同一中数据类型
。