黑马程序员-java之TreeSet,Comparable,Comparator

本文深入探讨了Java中TreeSet的排序原理,包括自然排序和自定义排序方式。通过自定义对象类实现Comparable接口进行自然排序,或通过Comparator接口实现自定义排序。同时,提供了存储自定义对象的实例代码,并演示了如何在集合中添加和遍历元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-------------android培训java培训、---------------


TreeSet可以对元素进行排序,缺省是按照自然排序进行排列,即元素必须实现Comparable接口,或者创建TreeSet对象的时候必须指定一个比较器
且元素唯一。
排序的两种方式:
方式一:让元素自身具备比较性,即让元素类实现Comparable接口,覆写compareTo(),这种排序方式是默认排序,也叫自然排序
方式二:当元素自身不具备比较性时,或者所具备的比较性不是实际需要的,这是就需要让集合TreeSet具备比较性,即在创建集合对象的时候指定比较器
当两种都存在时候,用比较器
原理:二叉树结构(左叉值小于右叉值),新元素大于原有元素,则放在叉的右边,小于则放在左边,等于则不存储
实例:存储自定义对象
代码:
package com.itheima;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

class Student implements Comparable{
    private String name;
    private int age;
    Student(String name,int age){
        this.name=name;
        this.age=age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public int compareTo(Object obj){//先按年龄比较,年龄相同则按名字自然排序
        if(!(obj instanceof Student)){
            throw new RuntimeException(obj.toString()+"不是学生");
        }
        Student stu = (Student)obj;
        //System.out.println(this.name+"---compareTo---"+stu.name);
        if(this.age>stu.age)
            return 1;
        if(this.age==stu.age){
            return this.name.compareTo(stu.name);
        }
        return -1;
    }
}
class myComparator implements Comparator{//先按姓名自然排序,姓名相同则按年龄升序排序
    public int compare(Object o1,Object o2){
        Student s1 = (Student)o1;
        Student s2 = (Student)o2;
        int num = s1.getName().compareTo(s2.getName());
        if(num==0){
            return new Integer(s1.getAge()).compareTo(s2.getAge());
        }
        return num;
    }
}
public class TreeSetDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        TreeSet ts = new TreeSet();//创建TreeSet对象
        TreeSet ts2 = new TreeSet(new myComparator());
        ts.add(new Student("zhangsan",18));//添加元素到对象ts
        ts.add(new Student("lisi",22));
        ts.add(new Student("wangwu",18));
        ts.add(new Student("zhaoliu",19));
        
        ts2.add(new Student("zhangsan",18));//添加元素到ts2
        ts2.add(new Student("lisi",22));
        ts2.add(new Student("wangwu",18));
        ts2.add(new Student("zhaoliu",19));
        ts2.add(new Student("wangwu",23));
        Iterator it = ts.iterator();
        Iterator it2 = ts2.iterator();
        System.out.println("----------ts中的元素------------");
        while(it.hasNext()){
            Student stu = (Student)it.next();
            System.out.println(stu.getName()+"---"+stu.getAge());
        }
        System.out.println("----------ts2中的元素------------");
        while(it2.hasNext()){
            Student stu2 = (Student)it2.next();
            System.out.println(stu2.getName()+"---"+stu2.getAge());
        }
    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值