TreeSet

TreeSet添加元素规则与排序详解
本文主要介绍了TreeSet添加元素的注意事项。若元素有自然顺序,按此排序存储;若没有,元素所属类可实现Comparable接口或创建TreeSet时传入比较器。比较时compareTo返回0,元素视为重复不添加。TreeSet能对字符串排序,因字符串已实现Comparable接口。

TreeSet:

TreeSet要注意的事项:

  1. 往TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序(1,2,3… a,b,c…)的特性进行排序存储

  2. 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,那么该元素所属的类可以实现实现Comparable接口,把元素的比较规则定义在CompareTo(T o)方法上。

  3. 如果比较元素的时候,compareTo方法返回的是0,那么该元素就被视为重复元素,不允许添加。(注意:TreeSet与HashCode、equals方法没有任何关系)

  4. 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而元素所属的类也没有实现Comparable接口,那么必须要在创建TreeSet的时候传入一个比较器。如何自定义比较器:自定义一个类实现Comparator接口即可,把元素与元素的比较规则定义在compare方法中。自定义比较器的格式:class 类名 implements Comparator{} 推荐使用Comparator比较器

  5. 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而元素所属的类即实现了Comparable接口,在创建对象的时候也传入了比较器,那么是以比较器的比较规则优先使

  6. TreeSet是可以对字符串进行排序的,因为字符串已经实现了Comparable接口
    字符串比较规则:逐个字符串取每个字符按自然顺序进行比较

    举例1:

    class Emp implements Comparable{
    	int id;
    	String name;
    	int age;
    
    	public Emp(int id, String name, int age) {
    		this.id = id;
    		this.name = name;
    		this.age = age;
    	}
    	
    	@Override
    	public String toString() {
    		return "{编号:"+this.id+" 姓名:"+this.name+" 年龄:"+this.age+"}";
    	}
    	
    	//元素与元素之间的比较规则
    	public int compareTo(Object o) {
    		Emp e=(Emp) o;
    		System.out.println(this.name+" compare "+e.name);	//用来输出哪两个元素进行了比较
    		return this.age-e.age; //根据元素的年龄进行排序
    	}
    }
    
    public class Tset {
    	public static void main(String[] args) {	
    		//1.往TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序(1,2,3...   a,b,c...)的特性进行排序存储
    		TreeSet tree = new  TreeSet();
    		tree.add(1);
    		tree.add(6);
    		tree.add(3);
    		tree.add(8);
    		tree.add(2);
    		System.out.println(tree);	//[1, 2, 3, 6, 8]
    	
    		//2.往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,那么该元素所属的类可以实现实现Comparable接口,把元素的比较规则定义在CompareTo(T o)方法上。
    		TreeSet tree2 = new  TreeSet();
    		tree2.add(new Emp(103, "猪悟能", 300));
    		tree2.add(new Emp(102, "孙悟空", 550));
    		tree2.add(new Emp(104, "沙悟净", 220));
    		tree2.add(new Emp(101, "唐玄奘", 25));
    		
    		//3.如果比较元素的时候,compareTo方法返回的是0,那么该元素就被视为重复元素,不允许添加
    		tree2.add(new Emp(105, "白龙马", 220)); //compareTo根据年龄进行比较,所以年龄相等的两个元素被视为重复元素
    		System.out.println(tree2);
    		//[{编号:101 姓名:唐玄奘 年龄:25}, {编号:104 姓名:沙悟净 年龄:220}, {编号:103 姓名:猪悟能 年龄:300}, {编号:102 姓名:孙悟空 年龄:550}]
    	}
    }
    

TreeSet存储原理:
在这里插入图片描述

举例2:

package com.test;

import java.util.Comparator;
import java.util.TreeSet;

//自定义比较器
class MyComparator implements Comparator{

	@Override
	public int compare(Object o1, Object o2) {
		Emp e1=(Emp) o1;
		Emp e2=(Emp) o2;
		return e1.id-e2.id;	//根据元素的id进行比较
	}		
}

public class Tset2 {
	public static void main(String[] args) {
	
		//4.往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而元素所属的类也没有实现Comparable接口,那么必须要在创建TreeSet的时候传入一个比较器。
		//5.往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而元素所属的类即实现了Comparable接口,在创建对象的时候也传入了比较器,那么是以比较器的比较规则优先使用
		
		//创建一个比较器
		MyComparator comparator=new MyComparator();
		
		//创建TreeSet的时候传入比较器
		TreeSet tree = new  TreeSet(comparator);
		tree.add(new Emp(101, "唐玄奘", 25));	//Emp实现了Comparable接口,但TreeSet也传入了自定义的比较器,使用自定义的比较器进行比较
		tree.add(new Emp(102, "孙悟空", 550));
		tree.add(new Emp(103, "猪悟能", 300));
		tree.add(new Emp(104, "沙悟净", 220));
		System.out.println(tree);
		//[{编号:101 姓名:唐玄奘 年龄:25}, {编号:102 姓名:孙悟空 年龄:550}, {编号:103 姓名:猪悟能 年龄:300}, {编号:104 姓名:沙悟净 年龄:220}]
	}
}

举例3:

package com.test;
import java.util.TreeSet;

public class Tset3 {

	public static void main(String[] args) {
//		6.TreeSet是可以对字符串进行排序的,因为字符串已经实现了Comparable接口
//		字符串比较规则:
// 			逐个字符串取每个字符按自然顺序进行比较
		
		TreeSet tset=new TreeSet();
		tset.add("acd");
		tset.add("bde");
		tset.add("abf");
		tset.add("bcabc");
		System.out.println(tset);	//[abf, acd, bca, bcabc, bde] 		
	}
}
### 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、付费专栏及课程。

余额充值