TreeSet集合内部排序

本文深入讲解了Java中TreeSet集合的使用方法,包括如何通过实现Comparable接口或使用Comparator接口来自定义排序规则,以及TreeSet底层的数据结构原理。
import java.util.*;

/*
    TreeSet集合内部实现了排序

    1. 自定义对象需要实现Comparable接口的compareTo方法,自定义排序规则,return 1(第一个元素大于第二个元素),0(相等),-1(小于) 
【正数负数均可,不一定要是1或者-1】

    2. 如果元素本身的排序规则不适用,那么自定义比较器实现Comparator接口,并在初始化集合的时传入。

    3. 底层数据结构是二叉树,大于放右边,小于放左边
*/

class TreeSetDemo {
    public static void main(String[] args) {
        TreeSet ts = new TreeSet(new Mycompare());

        // ts.add(new People("张三",3));
        // ts.add(new People("赵一",9));
     //  ts.add(new People("李四",4));
        // ts.add(new People("王五",5));
        // ts.add(new People("李四四",4));

        ts.add(new People("a02",3));
        ts.add(new People("a01",5));
        ts.add(new People("a39",9));
        ts.add(new People("a40",7));
        System.out.println(ts);

        Iterator i = ts.iterator();

        while(i.hasNext()) {
            People p = (People) i.next();
            System.out.println(p.getName() + "....." + p.getAge());
        }
    }
}

// 元素类实现Comparable接口,复写compareTo方法
class People implements Comparable {
    private String name;
    private int age;

    People (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 obj) {
        People p = (People) obj;
        if (this.age > p.age) {
            return 1;
        } else if (this.age == p.age){
            return this.name.compareTo(p.name);
        }
        return -1;
    }
}


// 比较器实现Comparator接口,复写compare方法
class Mycompare implements Comparator {
    public int compare(Object o1, Object o2) {
        People p1 = (People) o1;
        People p2 = (People) o2;

        int num = p1.getName().compareTo(p2.getName());

        if (num == 0) {
            return p1.getAge() - p2.getAge();
        }
        return num;
    }
}
### Java TreeSet 元素排序机制 Java 中 `TreeSet` 是基于红黑树(Red-Black Tree)实现的一种有序集合。它通过自然顺序或指定的比较器来维护其元素的顺序。 #### 自然顺序排序 如果存储在 `TreeSet` 中的对象实现了 `Comparable` 接口并重写了 `compareTo` 方法,则可以按照该方法定义的逻辑自动排序[^1]。例如: ```java public class Student implements Comparable<Student> { private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } @Override public int compareTo(Student other) { return Integer.compare(this.age, other.age); } @Override public String toString() { return "Student{name='" + name + "', age=" + age + "}"; } } ``` 在此示例中,学生对象按年龄升序排列[^2]。 #### 使用比较器进行自定义排序 除了依赖于 `Comparable` 的自然顺序外,还可以通过传递一个 `Comparator` 实现更灵活的排序规则。以下是使用匿名内部类的方式创建 `Comparator` 的例子: ```java import java.util.Comparator; import java.util.TreeSet; public class Main { public static void main(String[] args) { TreeSet<String> treeSet = new TreeSet<>(new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.length() - o2.length(); } }); treeSet.add("apple"); treeSet.add("banana"); treeSet.add("kiwi"); System.out.println(treeSet); // 输出: [kiwi, apple, banana] } } ``` 此代码片段展示了如何依据字符串长度对 `TreeSet` 进行排序[^3]。 另外,在实际应用中也可以利用 Lambda 表达式简化语法: ```java TreeSet<String> treeSet = new TreeSet<>((o1, o2) -> o1.length() - o2.length()); ``` 这种方法不仅保持了代码简洁性还增强了可读性和表达力。 ### 总结 对于希望控制 `TreeSet` 内部元素排序的情况,可以选择让目标类实现 `Comparable` 接口或者提供外部的 `Comparator` 来达成目的。每种方式都有各自适用场景以及优缺点需视具体需求而定。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值