TreeSet是一个有序的集合,它支持自然排序和根据实现Comparator或Comparable接口进行排序。下面通过案例来看一下TreeSet的使用
1、使用TreeSet对String类型的数据进行存储,存储顺序默认按字母升序排序。
在本例题中,定义TreeSet集合,并添加多个字符串到集合中,然后对集合进行遍历输出,并通过first()和last()方法来获取集合中的第一个和最后一个元素
package com.jinglan.sort;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
// 床架TreeSet对象,泛型类型为String
TreeSet<String> strSet = new TreeSet<>();
// 为strSet集合添加字符串数据
strSet.add("Java");
strSet.add("Python");
strSet.add("C++");
strSet.add("JavaScript");
// 循环输出strSet的值
for (String s : strSet) {
System.out.println(s + " ");
}
System.out.println();
// 返回集合中第一个元素,默认按升序最小的元素
System.out.println("集合中第一个元素:" + strSet.first());
// 返回集合中最后一个元素,默认按升序排序最大的元素
System.out.println("集合中最后一个元素:" + strSet.last());
}
}
【运行结果】
2、使用TreeSet对Integer类型数据进行存储,存储顺序默认按数字从小到大排序。
在本例题中,定义TreeSet对象,并向集合中添加整型数据,然后输出集合对象,也就是把数据放到[]中输出,这是集合的默认输出格式。最后使用floor()方法获得集合中最大的元素小于或等于给定元素的值,并输出
代码如下:
package com.jinglan.sort;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
// 床架TreeSet对象,泛型类型为Integer
TreeSet<Integer> intSet = new TreeSet<>();
// 为intSet集合添加字符串数据
intSet.add(10);
intSet.add(5);
intSet.add(8);
intSet.add(-1);
// 循环输出intSet的值
for (int i : intSet) {
System.out.println(i + " ");
}
System.out.println();
// 集合中最大的元素小于或等于给定的元素,如果没有则返回null
System.out.println("等于该元素的情况:" + intSet.floor(10));
System.out.println("小于该元素的情况:" + intSet.floor(2));
System.out.println("没有符合要求元素的情况:" + intSet.floor(-2));
}
}
【运行结果】
说明:
1、关于floor()方法。对于intSet.floor(10),集合中有等于10的元素,所以输出结果为10;对于intSet.floor(2),集合中没有2,那么小于2的最大元素就是-1,所以输出结果为-1;对于intSet.floor(-2),由于集合中没有小于等于-2的元素,所以输出结果为null
2、与floor()方法类似,TreeSet中还有一个higher()方法,用于返回严格大于给定元素的该集合中的最小元素,如果没有次元素则返回null。
3、当TreeSet中添加自定义类的对象时,是如何进行排序的呢?
这里需要实现Comparable和Comparator接口指定 以什么属性进行排序,以及是升序还是降序
下面以Comparator接口为例,实现Person对象按照年龄升序排序
①、定义Person类,包括编号、姓名和年龄三个属性,以及构造方法、get和set()方法,toString()方法等内容
②、定义PersonComparator类,实现年龄的升序排序
③、在测试类的主方法中,定义5个Person类的对象,并添加到TreeSet集合中,然后显示集合中的所有元素,并使用pollFirst()方法返回并删除集合第一个元素。
【Person类】
package com.jinglan.sort;
public class Person {
private String id;//编号
private String name;//姓名
private int age;//年龄
public Person() {
}
public Person(String id,String name,int age) {
this.id=id;
this.name=name;
this.age=age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
【PersonComparator类】
package com.jinglan.sort;
import java.util.Comparator;
public class PersonComparator implements Comparator<Person> {
public int compare(Person o1,Person o2) {
int age1 = o1.getAge();
int age2 = o2.getAge();
return age1-age2;
}
}
【测试类】
package com.jinglan.sort;
import java.util.TreeSet;
public class PersonTest {
public static void main(String[] args) {
//创建Person对象
Person p1 = new Person("001","Lucy",18);
Person p2 = new Person("002","Mike",20);
Person p3 = new Person("003","Jack",17);
Person p4 = new Person("004","Mark",19);
Person p5 = new Person("005","Bill",21);
TreeSet<Person> personSet = new TreeSet<>(new PersonComparator());
personSet.add(p1);
personSet.add(p2);
personSet.add(p3);
personSet.add(p4);
personSet.add(p5);
System.out.println("显示集合所有元素:");
for(Person p:personSet) {
System.out.println(p);
}
System.out.println("检索并删除第一个元素:");
//pollFirst()检索并删除集合第一个元素,如果集合为空则返回null
System.out.println(personSet.pollFirst());
System.out.println("显示所有集合:");
for(Person p:personSet) {
System.out.println(p);
}
}
}
【运行结果】
说明:
1、注意创建TreeSet对象时,要指定Comparator接口的实现类作为参数
TreeSet<Person> personSet = new TreeSet<>(new PersonComparator());
2、这里使用了pollFirst()方法,该方法比较特殊,可以返回元素,但是又把这个元素删除了,所以再次循环输出就没有age为17的元素了
3、还有一个方法pollLast(),该功能是检索并删除最后一个元素,如果集合为空则返回null,该方法的使用方式与pollFirst()类似
4、如果要对age进行降序排序,可以将PersonCompare类里age1和age2的顺序进行调换。