Java中的Comparable和Comparator

2019-05-13  本文已影响0人  文景大大

在我们开始比较Comparable和Comparator的异同之前,我们先来看看怎么正确地使用它们。

一、使用Comparable来排序

public class Fruit implements Comparable<Fruit> {
    private String name;
    private Integer weight;

    public Fruit(){}

    public Fruit(String name, Integer weight){
        this.name = name;
        this.weight = weight;
    }

    @Override
    public int compareTo(Fruit o) {
        if(this.name.equalsIgnoreCase(o.getName())){
            // 相同名称则按照重量降序排列,如果重量也相同则保持添加时的顺序不变
            return this.weight <= o.getWeight() ? 1 : -1;
        }
        return this.name.compareToIgnoreCase(o.getName());
    }

    // setters and getters...
}
    public static void main(String[] args) {
        Fruit apple1 = new Fruit("apple",12);
        Fruit apple2 = new Fruit("aPple",15);
        Fruit apple3 = new Fruit("Apple",9);
        Fruit apple4 = new Fruit("appLe",9);
        Fruit banana1 = new Fruit("baNana",7);
        Fruit banana2 = new Fruit("banAna",7);
        Fruit banana3 = new Fruit("Banana",14);

        List<Fruit> fruitList = new ArrayList<>();
        fruitList.add(banana3);
        fruitList.add(apple4);
        fruitList.add(apple3);
        fruitList.add(banana1);
        fruitList.add(apple2);
        fruitList.add(banana2);
        fruitList.add(apple1);

        // 按照水果名称升序排列,如果名称一致则按照重量降序排列
        Collections.sort(fruitList);

        for(Fruit fruit : fruitList){
            System.out.println(fruit.getName() + "-" + fruit.getWeight());
        }
    }

按照如上代码示例运行结果如下:

aPple-15
apple-12
appLe-9
Apple-9
Banana-14
baNana-7
banAna-7

二、使用Comparator来排序

public class Fruit {
    private String name;
    private Integer weight;

    public Fruit(){}

    public Fruit(String name, Integer weight){
        this.name = name;
        this.weight = weight;
    }

   // setters and getters...
}
public class FruitComparator implements Comparator<Fruit> {

    @Override
    public int compare(Fruit o1, Fruit o2) {
        if(o1.getName().equalsIgnoreCase(o2.getName())){
            // 相同名称则按照重量降序排列,如果重量也相同则保持添加时的顺序不变
            return o1.getWeight() <= o2.getWeight() ? 1 : -1;
        }
        return o1.getName().compareToIgnoreCase(o2.getName());
    }

}
    public static void main(String[] args) {
        Fruit apple1 = new Fruit("apple",12);
        Fruit apple2 = new Fruit("aPple",15);
        Fruit apple3 = new Fruit("Apple",9);
        Fruit apple4 = new Fruit("appLe",9);
        Fruit banana1 = new Fruit("baNana",7);
        Fruit banana2 = new Fruit("banAna",7);
        Fruit banana3 = new Fruit("Banana",14);

        List<Fruit> fruitList = new ArrayList<>();
        fruitList.add(banana3);
        fruitList.add(apple4);
        fruitList.add(apple3);
        fruitList.add(banana1);
        fruitList.add(apple2);
        fruitList.add(banana2);
        fruitList.add(apple1);

        // 按照水果名称升序排列,如果名称一致则按照重量降序排列
        fruitList.sort(new FruitComparator());
        // Collections.sort(fruitList, new FruitComparator());

        for(Fruit fruit : fruitList){
            System.out.println(fruit.getName() + "-" + fruit.getWeight());
        }
    }

按照如上代码示例运行结果如下:

aPple-15
apple-12
appLe-9
Apple-9
Banana-14
baNana-7
banAna-7

三、关于Comparable和Comparator的异同

相同点

不同点

四、使用总结

上一篇 下一篇

猜你喜欢

热点阅读