TreeSet

/*
Set:无序,不可重复
HashSet:数据结构式哈希表,线程非同步。保证元素唯一性的原理,判断hashCode是否相同,如果相同,判断元素的equals方法。
TreeSet:可以对集合中的元素进行排序,底层数据结构是二叉树,保证元素唯一性的依据:compareTo方法的return 0.
TreeSet的排序方法:
1、方法一:让元素自身具有比较性。元素需要实现Comparable接口,重写compareTo方法,这种方式也是元素的自然顺序,叫做默认排序
2、方法二:当元素不具备比较性,或者具备的比较性不是需要的,这时,要让集合自身具有比较性。在集合初始化时就具有比较性。在TreeSet初始化时,
			定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
	当两种排序都存在时,以比较器为主
	步骤:
	定义一个类,实现Comparator接口,重写compare方法,以return 0判断是否相同。
	ClassCastException - 如果参数的类型不允许此 Comparator 对它们进行比较。
*/
import java.util.*;
class  TreeSetDemo
{
	public static void main(String[] args) 
	{
		System.out.println("实现Comparable");
		TreeSet ts = new TreeSet();
		ts.add(new Student("java1",106));
		ts.add(new Student("java2",102));
		ts.add(new Student("java3",103));
		ts.add(new Student("java4",104));
		Iterator it = ts.iterator();
		while(it.hasNext())
		{
			Student stu = (Student)it.next();
			System.out.println(stu.getName() + "..." + stu.getAge());
		}

		System.out.println("实现Comparator");
		TreeSet ts1 = new TreeSet(new Person());
		ts1.add(new Person("java1",106));
		ts1.add(new Person("java2",102));
		ts1.add(new Person("java3",103));
		ts1.add(new Person("java4",104));
		Iterator it1 = ts1.iterator();
		while(it1.hasNext())
		{
			Person per = (Person)it1.next();
			System.out.println(per.getName() + "..." + per.getAge());
		}
	}
}

class Student implements Comparable
{
	private String name;
	private int age;
	Student(String name,int age)
	{
		this.name = name;
		this.age = age;
	}

	public String getName()
	{
		return this.name;
	}
	public int getAge()
	{
		return this.age;
	}
	
	public int compareTo(Object obj1)				//当主要条件相同时,进行次要条件判断,如果只有一个条件,那么相同就是两个对象相同,添加不成功													//导致添加不成功
	{
		if(!(obj1 instanceof Student))
			return -1;
		Student stu1 = (Student)obj1;
		if(stu1.age < this.age)
		{
			return -1;
		}
		if(this.age == stu1.age)
			return 0;
		return 1;
	}
}

class Person implements Comparator				//根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
{
	private String name;
	private int age;
	Person()
	{
	}
	Person(String name,int age)
	{
		this.name = name;
		this.age = age;
	}

	public String getName()
	{
		return this.name;
	}
	public int getAge()
	{
		return this.age;
	}
	
	public int compare(Object obj1,Object obj2)
	{
		Person p1 =(Person)obj1;
		Person p2 =(Person)obj2;
		if(p2.age > p1.age)
		{
			return 1;
		}

		if(p2.age == p1.age)
		{
			return 0;
		}

		return -1;
	}
}

04-09
### Java TreeSet 的使用方法及示例 #### 什么是 TreeSet? `TreeSet` 是 Java 集合框架中的一个重要实现类,它继承自 `AbstractSet` 并实现了 `NavigableSet` 接口。`TreeSet` 底层基于红黑树结构实现,因此它可以自动对存储的元素进行排序。 以下是关于 `TreeSet` 常见操作的具体说明及其代码示例: --- #### 创建并初始化 TreeSet 可以通过无参构造函数创建一个默认的 `TreeSet` 实例,或者通过指定比较器来定义排序方式[^4]。 ```java import java.util.TreeSet; public class Main { public static void main(String[] args) { // 默认按照自然顺序排列 TreeSet<Integer> treeSet = new TreeSet<>(); // 添加元素到 TreeSettreeSet.add(10); treeSet.add(5); treeSet.add(20); System.out.println("TreeSet elements: " + treeSet); // 输出 {5, 10, 20} } } ``` 上述代码展示了如何向 `TreeSet` 插入数据,并按升序排列[^2]。 --- #### 获取子集(subSet) 可以利用 `subSet()` 方法获取某个范围内的子集合。此方法接受两个参数:起始值和结束值(不包含结束值)。如果不存在满足条件的元素,则返回空集合[^1]。 ```java import java.util.TreeSet; public class SubSetExample { public static void main(String[] args) { TreeSet<Integer> treeSet = new TreeSet<>(); treeSet.add(1); treeSet.add(5); treeSet.add(10); treeSet.add(15); treeSet.add(20); // 获取介于 5 和 15 之间的元素(不含边界) System.out.println(treeSet.subSet(5, 15)); // 输出 [10] } } ``` --- #### 查找第一个元素(first()) 调用 `first()` 可以获得当前集合中最小的一个元素。如果没有元素存在则抛出异常[^3]。 ```java import java.util.TreeSet; public class FirstElementExample { public static void main(String[] args) { TreeSet<String> treeSet = new TreeSet<>(); treeSet.add("Apple"); treeSet.add("Banana"); treeSet.add("Cherry"); String firstElement = treeSet.first(); System.out.println("First element is: " + firstElement); // 输出 Apple } } ``` --- #### 自定义 Comparator 进行排序 当希望改变默认的自然排序逻辑时,可传入自定义的 `Comparator` 对象给 `TreeSet` 构造器。 ```java import java.util.Comparator; import java.util.TreeSet; public class CustomComparatorExample { public static void main(String[] args) { TreeSet<String> treeSet = new TreeSet<>(new Comparator<String>() { @Override public int compare(String s1, String s2) { return Integer.compare(s2.length(), s1.length()); // 按字符串长度降序排列 } }); treeSet.add("Short"); treeSet.add("LongerString"); treeSet.add("MediumLength"); System.out.println("Sorted by length descending: " + treeSet); // 输出 [LongerString, MediumLength, Short] } } ``` --- #### 总结 以上介绍了 `TreeSet` 的基本能以及一些常用的方法,包括但不限于添加元素、查找特定位置的数据项、提取部分区间的内容等。这些特性使得 `TreeSet` 成为了处理有序且唯一数据的理想容器之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值