重温java知识(三十六、类集框架之八:Set集合之TreeSet)

TreeSet子类可以针对设置的数据进行排序保存,TreeSet子类的定义结构如下:

public class TreeSet<E>
    extends AbstracSet<E>
    implements NavigableSet<E>, Cloneable, Serializable{}

NavigableSet接口为排序标准接口,是Set的子接口。

1、使用TreeSet保存数据的例子:

package com.mydemo;

import java.util.Set;
import java.util.TreeSet;

public class TreeSetDemo {

    public static void main(String[] args) {

        // 实例化集合接口
        Set<String> all = new TreeSet<>();

        // 保存数据
        all.add("h火影");
        all.add("h火影");      // 保存重复的数据
        all.add("s水影");
        all.add("f风影");
        all.add("t土影");
        all.add("l雷影");

        /**
         * 输出数据
         *
         * 所有保存的数据会按照由小到大的顺序(字符串会按照字母大小顺序依次比较)排列
         */
        System.out.println(all);

    }
}

运行结果:
[f风影, h火影, l雷影, s水影, t土影]

2、使用TreeSet保存自定义类对象的例子【TreeSet类在进行有序数据存储时依据的是Comparable接口实现排序,并且也是依据Comparable接口中的compareTo()方法来判断重复元素,所以在使用TreeSet进行自定义类对象保存时必须实现Comparable接口。但是在覆盖compareTo()方法时需要进行类中全部属性的比较,否则会出现部分属性相同时被误判为同一对象,导致重复元素判断失败】:

package com.mydemo;

import java.util.Set;
import java.util.TreeSet;

public class TreeSetDemo {

    public static void main(String[] args) {

        // 实例化集合接口
        Set<Member> all = new TreeSet<>();

        // 增加数据
        all.add(new Member("赵六", 21));
        all.add(new Member("李四2", 19));
        all.add(new Member("张三", 18));
        all.add(new Member("李四", 19));
        all.add(new Member("王五", 20));

        all.forEach(System.out::println);
    }
}

// 比较器
class Member implements Comparable<Member> {

    private String name;
    private int age;

    /**
     * 双参构造方法,属性赋值
     *
     * @param name
     * @param age
     */
    public Member(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Member{" +
                "姓名:'" + name + '\'' +
                ", 年龄:" + age +
                '}';
    }

    @Override
    public int compareTo(Member o) {
        if (this.age < o.age) {
            return -1;
        } else if (this.age > o.age) {
            return 1;
        } else {
            // 年龄相同时,进行姓氏比较
            return this.name.compareTo(o.name);
        }
    }
}

运行结果:
Member{姓名:'张三', 年龄:18}
Member{姓名:'李四', 年龄:19}
Member{姓名:'李四2', 年龄:19}
Member{姓名:'王五', 年龄:20}
Member{姓名:'赵六', 年龄:21}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值