JAVA集合Set(TreeSet)

文章介绍了Java中的Set集合,特别是TreeSet的特点,如不包含重复元素,无索引且可排序。它基于树数据结构实现,可以通过实现Comparable接口的compareTo方法进行自然排序,或者在创建TreeSet时传入Comparator实现自定义排序。示例展示了如何通过年龄对学生进行排序,并解释了compareTo和Comparator方法的工作原理。
摘要由CSDN通过智能技术生成

Set集合概述和特点

  • 可以去除重复

  • 存取顺序不一致

  • 没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取,删除Set集合里面的元素

Set接口

Set集合类在JAVA中以接口的形式存在因此需要通过多态的方法实现Set接口。一般用HashSet和TreeSet实现Set里面的方法。

TreeSet

TreeSet的特点

  • 不包含重复元素的集合

  • 没有带索引的方法

  • 可以将元素按照规则进行排序

  • 底层的数据结构是树

TreeSet的实现

如果要通过TreeSet实现Set集合,必须要制定一个排序规则。常用的两种方法:自然排序Comparable和比较器排序Comparator

Comparable:

  • 使用空参构造创建TreeSet集合

  • 自定义的Student类实现Comparable接口

  • 重写里面的compareTo​方法

学生类:

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

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

    public Student() {
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    @Override
    public int compareTo(Student o) {

        return this.age-o.age;
    }
}

测试类:

public static void main(String[] args) {
    Set<Student> set=new TreeSet<>();
    Student student=new Student(24,"Zeus");
    Student student2=new Student(21,"Zeus");
    Student student3=new Student(24,"Hades");
    set.add(student);
    set.add(student2);
    set.add(student3);
    for (Student s: set
         ) {
        System.out.println(s);
    }
}
}

结果:

注:通过重写Comparable接口里的方法comparaTo,并在代码块中设置条件,才能输出到控制台

方法comparaTo的原理如下

  • 如果返回值为负数,表示当前存入的元素是较小值,存左边

  • 如果返回值为0,表示当前存入的元素跟集合中元素重复了,不存

  • 如果返回值为正数,表示当前存入的元素是较大值,存右边

Comparator:

同样使用上述的Student类,但是这里不需要在Student类中实现Comparator接口

public static void main(String[] args) {
    TreeSet<Student> students=new TreeSet<>(new Comparator<Student>() {
        @Override
        public int compare(Student o1, Student o2) {
            return o2.getAge()-o1.getAge();//这里改了一下它的条件
        }
    });
    Student student=new Student(24,"Zeus");
    Student student2=new Student(21,"Zeus");
    Student student3=new Student(24,"Hades");
    students.add(student);
    students.add(student2);
    students.add(student3);
    for (Student st:students
         ) {
        System.out.println(st);
    }
}

结果:

可以看出,comparaTo和Comparator原理都是一致。只需要在两种方法体中写出所要求的输出条件即可。

两种比较方式小结

  • 自然排序:自定义类实现Comparable接口,重写compareTo​方法,根据返回值进行排序。

  • 比较器排序:创建TreeSet对象的时候传递Comparator的实现类对象,重写compare方法,根据返回值进行排序。

  • 在使用的时候,默认使用自然排序,当自然排序不满足现在的需求时,使用比较器排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值