TreeSet的使用

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的顺序进行调换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

立志Java工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值