TreeSet (Java学习第三十七天)

TreeSet

1、元素有序,这里的顺序是指存储和取出的顺序,按照一定的规则进行排序,排序的方式取决于 构造函数,如果传入的是无参,那么就是自然排序。如果传入的是带参,就是按照比较器的方法进行排序

2、没有带索引的方法,所以只能使用增强for 或者迭代器

3、不包含重复元素

自然排序代码如下

package day37;

import java.util.TreeSet;

public class TreeSetDemo01 {
    public static void main(String[] args) {
        //创建集合对象
        //只能使用引用类型,所以不能使用int 要用Integer
        TreeSet<Integer> ts = new TreeSet<Integer>();
        //添加元素
        ts.add(10); //jdk5h后会自动装箱
        ts.add(12);
        ts.add(8);
        for(Integer i : ts){
            System.out.println(i);
        }
    }
}

使用比较器排序,需要重写compareTo,注意重写的时候要考虑到所有的条件

package day37;
//如果要比较器,需要实现比较器接口
public class Student implements Comparable<Student>{
    private String name;
    private int age;

    public Student(){}

    public 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;}

    //需要重写comparable接口

    @Override
    public int compareTo(Student s) {
        //如果返回是0,默认会是同一个元素
        //return 0;
        //如果是1,就是比较存储顺序比较,而不是值.反之如果-1 就是反向存储顺序
        //return  1;
        //按照年龄.要升序this放前面,如果降序this放后面
        int num =  this.age - s.age;
        //比对如果年龄相同, 名字是否相同
        int num2 =  num == 0? this.name.compareTo(s.name):num;
        return num2;
    }
}



package day37;

import java.util.TreeSet;

public class TreeSetDemo02 {
    public static void main(String[] args) {
        //创建集合对象
        TreeSet<Student> ts = new TreeSet<Student>();

        //创建对象
        Student s1 = new Student("A",10);
        Student s2 = new Student("C",40);
        Student s3 = new Student("B",30);
        Student s4 = new Student("D",20);
        Student s5 = new Student("E",20);

        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
        ts.add(s4);
        ts.add(s5);
        for(Student s:ts){
            System.out.println(s.getName()+','+s.getAge());
        }


    }
}

#第二种写法,只是把Comparator接口的重写放在实例化的代码中

package day37;
//如果要比较器,需要实现比较器接口
public class Student{
    private String name;
    private int age;

    public Student(){}

    public 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;}

    //需要重写comparable接口


}


package day37;

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

public class TreeSetDemo03 {
    public static void main(String[] args) {
        TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                int num = s1.getAge()-s2.getAge();
                int num2 =  num == 0? s1.getName().compareTo(s2.getName()):num;
                return num2;
            }
        });

        Student s1 = new Student("A",10);
        Student s2 = new Student("C",40);
        Student s3 = new Student("B",30);
        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
        //遍历集合
        for(Student s:ts){
            System.out.println(s.getName()+","+s.getAge());
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值