java中 TreeSet类用法

本文介绍如何使用Java中的TreeSet进行自然排序。通过实现Comparable接口,自定义Point类以完成元素间的比较,从而实现TreeSet中元素的升序排列。演示了TreeSet的基本用法和迭代过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
TreeSet的性能比 HashSet差但是我们 在需要排序的时候可以用TreeSet 因为他是
自然排序也就是 升序
下面是TreeSet实现代码
这个类也似只能通过迭代器迭代元素
*/
import java.util.*;
class Test
{
private static TreeSet<Point> ts=new TreeSet<Point>() ; //静态变量 jdk1.5以后 引入范式
public static void main(String []args)
{
ts.add(new Point(2,3));
ts.add(new Point(1,7));
ts.add(new Point(8,8));
ts.add(new Point(1,3));
ts.add(new Point(0,4));
Iterator i=ts.iterator(); //迭代器
while(i.hasNext())
{
System.out.println(i.next());
}
}
}

class Point implements Comparable //实现 Comparable 接口 插入到TreeSet集合中的必须实现的
{
int x,y;
Point(int x,int y)
{
this.x=x;
this.y=y;
}
Point()
{
this.x=this.y=0;
}
public int compareTo(Object o) //实现 compareTo函数
{
Point p=(Point)o;
int num=x>p.x?1:(x==p.x?0:-1) ;
if(num==0)
return y>p.y?1:(y==p.y?0:-1);
return num ;

}
public String toString()
{
return "x="+x+",y="+y;
}

}

### Java TreeSet 的特性 TreeSet 是一种实现了 `NavigableSet` 接口的有序集合,内部通过红黑树来维护元素之间的顺序[^1]。这种数据结构不仅能够高效地执行插入、删除和查找操作,还支持自然排序或自定义排序。 #### 自然排序与定制排序 当不提供显式的比较器时,默认按照元素自身的自然顺序进行升序排列;如果希望改变默认行为,则可以在创建实例的时候传入一个实现 `Comparator<T>` 接口的对象作为参数[^2]。 ```java // 使用自然排序 TreeSet<Integer> naturalOrderTs = new TreeSet<>(); naturalOrderTs.add(5); naturalOrderTs.add(3); System.out.println(naturalOrderTs); // 输出 [3, 5] // 定制降序排序 TreeSet<Integer> customOrderTs = new TreeSet<>(Collections.reverseOrder()); customOrderTs.add(5); customOrderTs.add(3); System.out.println(customOrderTs); // 输出 [5, 3] ``` #### 添加自定义比较器 除了使用内置的方法外,还可以通过匿名内部或者Lambda表达式的方式指定更复杂的逻辑来进行对象间的对比: ```java import java.util.*; class Person { String name; int age; public Person(String n, int a) { this.name = n; this.age = a; } @Override public String toString() { return "Person{name='" + name + "', age=" + age + "}"; } } public class Main { public static void main(String[] args) { TreeSet<Person> people = new TreeSet<>((p1, p2) -> Integer.compare(p1.age, p2.age)); people.add(new Person("Alice", 30)); people.add(new Person("Bob", 25)); System.out.println(people); // 根据年龄从小到大输出人员列表 } } ``` 上述代码展示了如何利用 Lambda 表达式简化语法并提高可读性的同时完成相同的功能需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值