TreeSet的自然排序和定制排序

本文介绍了Java中的TreeSet数据结构,包括其自然排序和定制排序的原理及应用。通过示例代码展示了如何根据对象的属性进行排序,如按照名字或ID进行排序。
摘要由CSDN通过智能技术生成

TreeSet的自然排序和定制排序

TreeSet

  1. 向TreeSet中添加的元素必须时同一个类的。
  2. 可以按照添加进集合中的元素的指定的顺序遍历。
  3. 当向TreeSet中添加自定义类的对象时,有两种排序方法:

自然排序

要求自定义类实现java.lang.Comparable接口并重写其compareTo(Object object)方法,
在此方法中,指明按照自定义类的哪个属性进行排序。

代码实现(按照名字排序):
Person实体类

import java.util.Objects;
public class Person implements Comparable{
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
//此处省略空参构造器和get() set()方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age &&
                Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
        return "name:" + name + ", age:" + age;
    }

    /**
     * 当向treeset中添加person对象时,依据此方法,确定按照哪个属性排序
     * @param o
     * @return
     */
   @Override
    public int compareTo(Object o) {
        if (o instanceof Person){
//            return this.name.compareTo(((Person) o).name);
            int i = this.name.compareTo(((Person) o).name);
            if (i == 0){ //若名字相等,再比较年龄
                return this.age - ((Person) o).age;
            }
            return i;
        }
        return 0;
    }
}

测试类

import java.util.TreeSet;
public class TreeSetDemo {
    public static void main(String[] args) {
        testNaturalOrdering();
    }
     /**
     * TreeSet的自然排序
     */
    public static void testNaturalOrdering(){
        TreeSet<Person> set = new TreeSet<>();

        //如果Person类没有实现Comparable接口,向TreeSet中添加Person对象时会报ClassCast异常
        set.add(new Person("AA",20));
        set.add(new Person("GG",25));
        set.add(new Person("BB",21));
        set.add(new Person("DD",22));
        set.add(new Person("MM",19));
        set.add(new Person("AA",20));

        for (Object obj:set) {
            System.out.println(obj);
        }
    }
}

运行结果:

name:AA, age:20
name:AA, age:21
name:BB, age:21
name:DD, age:22
name:GG, age:25
name:MM, age:19

定制排序

1.创建一个实现了Comparator接口的类对象
2.将此对象作为形参传入TreeSet的构造器
3.向TreeSet中添加元素

代码实现(按照id排序):
Customer实体类

import java.util.Objects;
public class Customer {
    String name;
    String id;

    public Customer(String name, String id) {
        this.name = name;
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Customer customer = (Customer) o;
        return Objects.equals(name, customer.name) &&
                Objects.equals(id, customer.id);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, id);
    }

    @Override
    public String toString() {
        return "name:" + name + ", id:" + id ;
    }
}

测试类

import java.util.Comparator;
import java.util.TreeSet;
public class TreeSetDemo {
    public static void main(String[] args) {
//        testNaturalOrdering();
        testCustomSodrt();
    }

    /**
     * TreeSet的定制排序
     */
    public static void testCustomSodrt(){
        Comparator com = new Comparator() {
            //向TreeSet中添加Customer类的对象,在此compare()方法中,指明是按照Customer的哪个属性排序的
            @Override
            public int compare(Object o1, Object o2) {
                if (o1 instanceof Customer && o2 instanceof Customer){
                    Customer c1 = (Customer)o1;
                    Customer c2 = (Customer)o2;
                    int i = c1.getId().compareTo(c2.getId());
                    if (i == 0){ //若id相等,再比较name
                        return c1.getName().compareTo(c2.getName());
                    }
                    return i;
                }
                return 0;
            }
        };
        TreeSet<Customer> set = new TreeSet<>(com);
        set.add(new Customer("AA","1101"));
        set.add(new Customer("HH","1001"));
        set.add(new Customer("FF","1111"));
        set.add(new Customer("NN","2101"));
        set.add(new Customer("GG","1101"));
        set.add(new Customer("AA","1103"));

        for (Object obj:set) {
            System.out.println(obj);
        }
    }
}

运行结果

name:HH, id:1001
name:AA, id:1101
name:GG, id:1101
name:AA, id:1103
name:FF, id:1111
name:NN, id:2101
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值