总结
- TreeSet 是 SortedSet 接口的实现类,TreeSet 可以确保集合元素处于排序状态。
- TreeSet 支持两种排序方法:自然排序和定制排序。默认情况下,TreeSet 采用自然排序。
自然排序
排序:TreeSet 会调用集合元素的 compareTo(Object obj) 方法来比较元素之间的大小关系,然后将集合元素按升序排列
如果 this > obj,返回正数 1
如果 this < obj,返回负数 -1
如果 this = obj,返回 0 ,则认为这两个对象相等
必须放入同样类的对象.(默认会进行排序) 否则可能会发生类型转换异常.我们可以使用泛型来进行限制
import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
public class Test {
public static void main(String[] args) {
Set<Integer> set = new TreeSet<Integer>();
//添加元素
set.add(10);
set.add(4);
set.add(99);
set.add(66);
//移除元素
set.remove(1);
//是否包含某种元素
set.contains(99);
//TreeSet自然排序
System.out.println(set);
//使用迭代器遍历集合
Iterator<Integer> st = set.iterator();
while(st.hasNext()) {
System.out.println(st.next());
}
//使用for each迭代集合
for(Integer i :set) {
System.out.println(i);
}
}
定制排序
如果需要实现定制排序,则需要在创建 TreeSet 集合对象时,提供一个 Comparator 接口的实现类对象。由该 Comparator 对象负责集合元素的排序逻辑
import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
public class Test {
public static void main(String[] args) {
/**
* 定制排序
* 如果需要实现定制排序,则需要在创建 TreeSet 集合对象时,
* 提供一个 Comparator 接口的实现类对象。
* 由该 Comparator 对象负责集合元素的排序逻辑
*/
Person p5 = new Person(111,"李四");
Person p1 = new Person(13,"张三");
Person p2 = new Person(9,"王二");
Person p3 = new Person(101,"李逵");
Person p4 = new Person(111,"李某人");
//创建一个person对象的泛型集合
Set<Person> p = new TreeSet<Person>(new Person());
//将对象加入集合
p.add(p1);
p.add(p2);
p.add(p3);
p.add(p4);
p.add(p5);
//for each遍历集合
for(Person set1:p) {
System.out.println(set1.age+" "+set1.name);
}
}
}
//实现Comparator接口
class Person implements Comparator<Person>{
int age;
String name;
//定义一个无参构造和有参构造
Person() {}
Person(int age,String name){
this.name = name;
this.age = age;
}
//重写compare方法,自定义排序方式
@Override
public int compare(Person o1, Person o2) {
if(o1.age>o2.age) {
return 1;
}else if(o1.age<o2.age) {
return -1;
}
return 0;
}}