Java基础 TreeSet的自定义类型实现Comparable接口

//java规定在TreeSet集合中需要实现Comparable接口,之所以String类型和Integer类型不需要是因为它们底层实现了Comparable接口
import java.util.TreeSet;

public class TreeSetTest04 {
    public static void main(String[] args) {
        //创建TreeSet集合,指定Vip型
        TreeSet<Vip> vips=new TreeSet<Vip>();
        //往集合中添加元素
        vips.add(new Vip("zhangsan",18));
        vips.add(new Vip("lisi",25));
        vips.add(new Vip("wangwu",33));
        vips.add(new Vip("zhaoliu",25));
        //遍历输出
        for (Vip s:vips){
            System.out.println(s);
        }
    }
}

public class Vip implements Comparable<Vip>{
    String name;
    int age;

    public Vip() {
    }

    public Vip(String name,int age) {
        this.name = name;
        this.age=age;
    }

    @Override
    public String toString() {
        return "Vip{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    //this.age代表当前的对象的属性,o.age代表将要进行比较的对象的属性,二者进行比较,age相同,比较name属性,age不同,直接返回age
    //返回值有等于0,大于0和小于0,至于为什么设定此返回值,因为自平衡二叉树(不细说,下次有机会再说)
    public int compareTo(Vip o) {
        if (this.age==o.age){
            return this.name.compareTo(o.name);
        }else{
            return this.age-o.age;
        }
    }
}
要将自定义类型的 `ArrayList` 转换为 `TreeSet`,需要满足以下两个条件: 1. 自定义类型必须实现 `Comparable` 接口,重写 `compareTo` 方法,以便 `TreeSet` 可以进行排序。 2. 如果自定义类型没有实现 `Comparable` 接口,可以在创建 `TreeSet` 对象时传入一个自定义的比较器对象。 以下是一个示例代码: ```java import java.util.ArrayList; import java.util.Comparator; import java.util.TreeSet; public class Main { public static void main(String[] args) { // 创建一个自定义类型的 ArrayList 对象 ArrayList<Person> arrayList = new ArrayList<>(); arrayList.add(new Person("Alice", 20)); arrayList.add(new Person("Bob", 30)); arrayList.add(new Person("Charlie", 25)); // 将 ArrayList 转换成 TreeSet TreeSet<Person> treeSet = new TreeSet<>(new Comparator<Person>() { @Override public int compare(Person p1, Person p2) { // 按照年龄进行排序 return p1.getAge() - p2.getAge(); } }); treeSet.addAll(arrayList); // 打印结果 System.out.println("ArrayList: " + arrayList); System.out.println("TreeSet: " + treeSet); } } class Person implements Comparable<Person> { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return name + "(" + age + ")"; } @Override public int compareTo(Person p) { // 按照姓名进行排序 return name.compareTo(p.getName()); } } ``` 输出结果为: ``` ArrayList: [Alice(20), Bob(30), Charlie(25)] TreeSet: [Alice(20), Charlie(25), Bob(30)] ``` 在上面的示例中,`Person` 类实现了 `Comparable` 接口,并重写了 `compareTo` 方法,以便 `TreeSet` 可以按照姓名进行排序。如果 `Person` 类没有实现 `Comparable` 接口,就需要在创建 `TreeSet` 对象时传入一个自定义的比较器对象,这使用了匿名内部类的方式。在比较器对象中,将按照年龄进行排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值