使用Comparable/Comparator,匿名内部类以及lambda表达式进行排序

Comparable/Comparator以及lambda表达式

继承Comparable接口进行排序

这两个接口是为了和类比较大小的


class Goods implements Comparable<Goods> {
    //实现Comparable接口必须要进行ComparaTo方法重写
    
    private String name;//商品名称
    private double price;//商品价格

    public Goods() {
    }

    public Goods(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public Goods setName(String name) {
        this.name = name;
        return this;
    }

    public double getPrice() {
        return price;
    }

    public Goods setPrice(double price) {
        this.price = price;
        return this;
    }

    @Override
    public String toString() {
        return "Goods{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }

    @Override //指定规则
    public int compareTo(Goods o) {
       1. //字符串用comparaTo(String自带方法)
        //return this.name.compareTo(o.name);(如果字符串首字母有A,就进行排序)
        2.//是哪一种类型,就用哪一种类型的封装类
        //return Double.compare(this.price,o.price);
           
        3.//用比较进行排序,如果this>o,返回1则为升序
        if (this.price > o.price) {
            return 1;
        } else if (this.price == o.price) {
            return 0;
        } else {
            return -1;
        }
    }
}

public class TestAAA {
        public static void main(String[] args) {
            Goods[] arr = new Goods[4];
            arr[0] = new Goods("红楼梦D", 40);
            arr[1] = new Goods("西游记B", 20);
            arr[2] = new Goods("三国A", 60);
            arr[3] = new Goods("水浒C", 10);

            Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
        }
}

Comparator接口的3种排序方法

Comparator是对ComparaTo方法内的比较算法不满意,自己在重新定义排序,

一般实现在一个新的类中,然后在排序Sort时,进行new 新类(Arrays.Sort(arr, new narr))

class Sot implements Comparator<Goods> {

    @Override
    public int compare(Goods o1, Goods o2) {
        //如果需要倒叙,给Doule前面加负号
        return -Double.compare(o1.getPrice(), o2.getPrice());
    }
}

public class TestAAA {
        public static void main(String[] args) {
            Goods[] arr = new Goods[4];
            arr[0] = new Goods("红楼梦D", 40);
            arr[1] = new Goods("西游记B", 20);
            arr[2] = new Goods("三国A", 60);
            arr[3] = new Goods("水浒C", 10);

            1.//新new一个类进行排序(Sot实现Comparator接口)
            Arrays.sort(arr, new Sot());
       
            2.//使用匿名内部类
              //和匿名对象一样,通常使用在只使用一次的时候,方便、简单
           Arrays.sort(arr, new Comparator<Goods>() {
                @Override
                public int compare(Goods o1, Goods o2) {
              	return Double.compare(o1.getPrice(), o2.getPrice());
                    	//o1.compareTo(o2);(默认排序ABCD)
                }
            });     
            
            3.lambda表达式
                            Arrays.sort(arr, (o1, o2) -> {
            return o1.getName().compareTo(o2.getName());
                                
//            return o1.compareTo(o2);(因为Goods实现了Comparable)
//            return Double.compare(o1.getPrice(),o2.getPrice());
//            if (o1.getPrice() > o2.getPrice()){
//                return 1;
//            }else if (o1.getPrice() == o2.getPrice()){
//                return 0;
//            }else {
//                return -1;
//            }
//        });
        }
}

创建一个类实现comparator

定义排序规则

//不能改源码的情况下,使用comparator(传入数组和实现类)

3种实现:直接o1比o2(comparaTo)comparable的

2String:o1.comparaTo

3Double.compare(int x, int y)

4手动比较进行排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值