Java 中的比较器

比较器

TreeSet集合中元素可排序的方式:使用比较器的方式

结论:放到TreeSet或者TreeMap集合中的key部分的元素要想做到排序,有两种方法:

第一种:放到集合中的元素实现java.lang.Comparable接口

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

public class TreeSetTest02 {
    public static void main(String[] args) {
        TreeSet<WuGui> wuGuis = new TreeSet<>();

        wuGuis.add(new WuGui(100));
        wuGuis.add(new WuGui(1000));
        wuGuis.add(new WuGui(60));
        for(WuGui a : wuGuis){
            System.out.println(a);
        }

    }
}


class WuGui implements Comparable<WuGui>{
    int age;
    public WuGui(int age ){
        this.age = age;
    }

    @Override
    public String toString() {
        return "WuGui{" +
                "age=" + age +
                '}';
    }

    @Override
    public int compareTo(WuGui o) {
        return this.age - o.age;
    }
}

第二种:在构造TreeSet或者TreeMap集合中传递一个比较器Comparator

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

public class TreeSetTest02 {
    public static void main(String[] args) {
        //创建TreeSet集合的时候,需要使用比较器
        // TreeSet<WuGui> wuGuis = new TreeSet<>();//这样不行,没有通过构造方法传递一个比较器
        // 通过构造方法传递一个比较器
//        TreeSet<WuGui> wuGuis = new TreeSet<>(new WuGuiCompparator());

        // 还可以使用匿名内部类的方式
        TreeSet<WuGui> wuGuis = new TreeSet<>(new Comparator<WuGui>() {
            @Override
            public int compare(WuGui o1, WuGui o2) {
                return -o1.age + o2.age;
            }
        });

        wuGuis.add(new WuGui(100));
        wuGuis.add(new WuGui(1000));
        wuGuis.add(new WuGui(60));
        for(WuGui a : wuGuis){
            System.out.println(a);
        }

    }
}


class WuGui{
    int age;
    public WuGui(int age ){
        this.age = age;
    }

    @Override
    public String toString() {
        return "WuGui{" +
                "age=" + age +
                '}';
    }
}
// 单独编写一个比较器
// 比较器实现是java.util.Comparator下的 (Comparable 是java.lang包下的)
class WuGuiCompparator implements Comparator<WuGui>{
    //指定规则
    //按照年龄排序
    @Override
    public int compare(WuGui o1, WuGui o2) {
        return -o1.age + o2.age;
    }
}
  • 对于Comparable 和 Comparator怎么选择?

当比较器规则不会发生改变的时候,或者说比较器规则单一,建议实现Comparable接口

如果比较器规则多个,并且需要多个比较器之间频繁切换,建议使用Comparator接口

Comparator接口符合OCP原则

posted @ 2024-02-06 15:35  十几里路  阅读(16)  评论(0)    收藏  举报