Java中TreeSet集合存储自定义类型

TreeSet集合存储自定义类型:

1、我们都知道TreeSet存储元素是自动按照从小到大排序的,那么存储的是自定义类型呢?

它还会按照从小到大排序吗?我们来测试一下:
发现存数据时都会抛出异常,更别说自动排序了。

// 运行抛出异常:java.lang.ClassCastException: class Person cannot be cast to class java.lang.Comparable.

// 这个异常是说:Person类型不能转换成Comparable类型,这个Comparable以able结尾,显然是个接口。


2、所以说系统要求我们能转换成Comparable类型,也就是要求Person类去实现Comparable接口,就是要我们定义Person类的比较规则。

那么如何重写Comparable接口的compareTo方法呢?

测试代码:

import java.util.*;

public class Test07 {
     
    public static void main(String[] args) {
     
        // 创建TreeSet对象
        Set<Person> people = new TreeSet<>();

        // 添加Person对象
        /*people.add(new Person(30, "zhangsan"));
        people.add(new Person(20, "lisi"));
        people.add(new Person(10, "wangwu"));*/
        // 运行抛出异常:java.lang.ClassCastException: class Person cannot be cast to class java.lang.Comparable
        // 这个异常是说:Person类型不能转换成Comparable类型,这个Comparable以able结尾,显然是个接口
        // 说以说系统要求我们能转换成Comparable类型,也就是要求Person类去实现Comparable接口,就是要我们定义Person类的比较规则

        // 实现Comparable接口之后
        people.add(new Person(30, "zhangsan"));
        people.add(new Person(20, "lisi"));
        people.add(new Person(10, "wangwu"));
        System.out.println(people.size());  // 3

        // 遍历people,查看元素有没有排序
        for (Person p : people) {
     
            System.out.print(p + "   ");
            //按照年龄升序: 10-wangwu   20-lisi   30-zhangsan
            //按照名字升序: 20-lisi   10-wangwu   30-zhangsan
        }
        System.out.println();

    }
}

class Person implements Comparable<Person> {
     
    int age;
    String name;

    public Person() {
     

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

    // 按照年龄排序
    /*public int compareTo(Person p) {
        return age - p.age;  // 这样写:返回负数,表示升序
        //return p.age - age  // 这样写:返回正数,表示降序
        //return 0;  // 返回0表示不排序
    }*/

    // 按照名字排序
    public int compareTo(Person p) {
     
        return name.compareTo(p.name);  // 调用String的排序规则,升序
        //return p.name.compareTo(name);  // 这样写表示降序
        //return 0;  // 这样写表示不排序
    }

    // 重写toString()方法
    public String toString() {
     
        return age + "-" + name;
    }

}

总结:

1、TreeSet的存储无序不可重复,不可存null,存入的元素会自动从小到大排序。

2、存入TreeSet集合中的元素必须实现Comparable接口,并手动重写比较的规则。

你可能感兴趣的:(Java,EE,java,TreeSet存储自定义类型)