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对象,泛型类型为StringTreeSet 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对象,泛型类型为IntegerTreeSet 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();// 集合中最大的元素小于或等于给定的元素,如果没有则返回nullSystem.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;}@Overridepublic String toString() {return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";}}
【PersonComparator类】
package com.jinglan.sort;import java.util.Comparator;public class PersonComparator implements Comparator {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 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()检索并删除集合第一个元素,如果集合为空则返回nullSystem.out.println(personSet.pollFirst());System.out.println("显示所有集合:");for(Person p:personSet) {System.out.println(p);}}}
【运行结果】
说明: 1、注意创建TreeSet对象时,要指定Comparator接口的实现类作为参数
TreeSet personSet = new TreeSet(new PersonComparator());
2、这里使用了pollFirst()方法,该方法比较特殊,可以返回元素,但是又把这个元素删除了,所以再次循环输出就没有age为17的元素了 3、还有一个方法pollLast(),该功能是检索并删除最后一个元素,如果集合为空则返回null,该方法的使用方式与pollFirst()类似 4、如果要对age进行降序排序,可以将PersonCompare类里age1和age2的顺序进行调换。
【文章原创作者:韩国服务器 https://www.68idc.cn 欢迎留下您的宝贵建议】