TreeSet的另一种自定义排序:实现比较器接口

TreeSet的另一种实现自定义排序:实现比较器接口

1、使用TreeSet的有参数构造方法,传一个指定的比较器对象。

Comparable接口和Comparator接口怎么选择呢?到底用哪个好?

当比较规则不会发生改变的时候,或者说当比较规则只有1种的时候,建议实现Comparable接口。

比较规则有多种,并且需要多个规则之间来回切换,建议实现Comparator接口。

其中Comparator接口的设计符合OCP原则。


假设有一个Customer类,待比较的对象:

class Customer {
    int age;
    String name;

    public Customer() {

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

    @Override
    public String toString() {
        return age + "-" + name;
    }
}

设计比较器对象,实现java.util.Comparator接口:

class CustomComparator implements Comparator<Customer> {
    @Override
    public int compare(Customer o1, Customer o2) {
        // 年龄相同按照名字升序
        if (o1.age == o2.age) {
            return o1.name.compareTo(o2.name);
        } else {  // 年龄不相同
            return o1.age - o2.age;  // 按照年龄升序
        }
    }
}

测试代码:

import java.util.*;

public class Test09 {
    public static void main(String[] args) {
        // 创建TreeSet对象
        //Set<Customer> customs = new TreeSet<>(new CustomComparator());

        // 也可以使用匿名内部类,直接new接口
        Set<Customer> customs = new TreeSet<>(new Comparator<Customer>() {
            @Override
            public int compare(Customer o1, Customer o2) {
                // 年龄相同按照名字升序
                if (o1.age == o2.age) {
                    return o1.name.compareTo(o2.name);
                } else {  // 年龄不相同
                    return o1.age - o2.age;  // 按照年龄升序
                }
            }
        });

        // 添加Customer对象
        customs.add(new Customer(30, "zhangyi"));
        customs.add(new Customer(25, "zhanger"));
        customs.add(new Customer(20, "zhangsan"));
        customs.add(new Customer(20, "liyi"));
        customs.add(new Customer(25, "lier"));
        customs.add(new Customer(30, "lisan"));

        // 遍历集合
        for (Customer c : customs) {
            System.out.print(c + "   ");  //20-liyi   20-zhangsan   25-lier   25-zhanger   30-lisan   30-zhangyi
        }
        System.out.println();

        /*
            所以存到TreeSet集合中的元素要想做到排序,有2种方法:
            第一种:元素类实现java.lang.Comparable接口,重写比较规则。
            第二种:在TreeSet的有参数构造方法中传一个比较器对象。

        * */
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值