Java如何使用Arrays.sort();中自定义排序方法 两个案例理解

目录

1.首先理解这个sort方法我们先看一个简单的自定义排序

 1.1如果还不了解匿名内部类  可以暂时看看这个  理解一下匿名内部类在其中的作用(这里不对匿名内部类做过多介绍)

2.到这里大家应该都理解  决定我们排序方式的   其实就是Comparator中compare方法的返回值

2.1下面是简易版本的sort底层逻辑 用冒泡排序来演示

3.对一个对象数组进行自定义排序


1.首先理解这个sort方法我们先看一个简单的自定义排序

        正常来说自定义排序sort 有两个参数,第一个就是我们要排序的数组,第二个是一个接口(匿名内部类)

        Integer a[] = {1, 2, 9, 4, 6, 2, 6, 7};
        Arrays.sort(a, new Comparator<Integer>() {//匿名内部类
            @Override
            public int compare(Integer o1, Integer o2) {
            //自定义排序 o1-o2 为从小到大  返回的值是大于零还是小于零 决定排序的方式
                return o1 - o2;
            }
        });
        System.out.println(Arrays.toString(a));//展示数组信息
        //[1, 2, 2, 4, 6, 6, 7, 9]输出结果

 1.1如果还不了解匿名内部类  可以暂时看看这个  理解一下匿名内部类在其中的作用(这里不对匿名内部类做过多介绍)

public class A implements Comparator {
    @Override
    public int compare(Object o1, Object o2) {
        return (int) o1-(int) o2;
    }
}
        Integer a[] = {1, 2, 9, 4, 6, 2, 6, 7};
        Arrays.sort(a,A);//A 是实现了Compartor接口的类
        System.out.println(Arrays.toString(a));//展示数组信息
        //[1, 2, 2, 4, 6, 6, 7, 9]输出结果

2.到这里大家应该都理解  决定我们排序方式的   其实就是Comparator中compare方法的返回值

        “返回的值是大于零还是小于零 决定排序的方式”

2.1下面是简易版本的sort底层逻辑 用冒泡排序来演示

package Com.Wrapper;

import java.util.Arrays;
import java.util.Comparator;

public class ArraysBubble {
    public static void main(String[] args) {
        int a[] = {1, 2, 5, 1, 632, 57, 12, 34, 2};
        Bubble.SortBubble(a, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {//前一个值减去后一个返回差值
                int i1 = (int) o1;
                int i2 = (int) o2;
                return i1 - i2;
            }
        });
        System.out.println(Arrays.toString(a));
    }
}
//用冒泡排序来演示 简易版 sort底层逻辑
class Bubble {
    public static void SortBubble(int[] a, Comparator c) {
    //第一个参数是数组 第二个是接口 接口决定了我们是交换还是不交换
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a.length - 1; j++) {
                //向接口传值 如果前一个数减去下一个数大于零 就说明比他大我们要交换 
                if (c.compare(a[j], a[j + 1]) > 0) {//大于号小于号决定是从大到小还是从小到大
                    int temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                }
            }
        }
    }
}

最后结果[1, 1, 2, 2, 5, 12, 34, 57, 632]

3.对一个对象数组进行自定义排序

package Com.Wrapper;

import java.util.Arrays;
import java.util.Comparator;

public class ArraysSort_01 {
    public static void main(String[] args) {
        Book book[]=new Book[5];
        book[0]=new Book("红楼梦上册",45.2);
        book[1]=new Book("金瓶梅中",23.23);
        book[2]=new Book("三国演义下册",34.7);
        book[3]=new Book("西游记",45);
        book[4]=new Book("水浒传精校完整版",100.25);

        //根据price排序
        Arrays.sort(book, new Comparator<Book>() {//这里使用匿名内部类 实现接口方法 来自定义你想根据哪个值来排序
            //底层使用的是一个二叉数排序
            @Override
            public int compare(Book o1, Book o2) {//o1 和 o2其实都是book o1为当前元素 o2为下一个元素
                //这里需要用到if 是因为这个接口的返回类型已经固定死为int 我们必须返回int类型所做的判断
                //注意这个底层是根据 返回值来判断自定义排序 o1-o2 为从小到大 返回的值是大于零还是小于零 决定顺序的方式
                if (o1.getPrice()-o2.getPrice()>0) return 1;
                else if (o1.getPrice()-o2.getPrice()<0) {
                    return -1;
                }else return 0;
            }
        });
        System.out.println(Arrays.toString(book));//展示排序后的数据
        //[Book{name='金瓶梅中', price=23.23}, Book{name='三国演义下册', price=34.7}, Book{name='西游记', price=45.0}, Book{name='红楼梦上册', price=45.2}, Book{name='水浒传精校完整版', price=100.25}]

        //根据name排序
        Arrays.sort(book, new Comparator<Book>() {//这里使用匿名内部类 实现接口方法 来自定义你想根据哪个值来排序
            //底层使用的是一个二叉数排序
            @Override
            public int compare(Book o1, Book o2) {//o1 和 o2其实都是book o1为当前元素 o2为下一个元素
                //注意这个底层是根据 返回值来判断自定义排序 o1-o2 为从小到大 返回的值是大于零还是小于零 决定顺序的方式
               return o1.getName().length()-o2.getName().length();
            }
        });

        System.out.println(Arrays.toString(book));//展示排序后的数据
        //[Book{name='西游记', price=45.0}, Book{name='金瓶梅中', price=23.23}, Book{name='红楼梦上册', price=45.2}, Book{name='三国演义下册', price=34.7}, Book{name='水浒传精校完整版', price=100.25}]
    }
}
class Book{
    private String name;
    private double price;

    public String getName() {
        return name;
    }

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

    public double getPrice() {
        return price;
    }

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

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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值