Java中关于Arrays.sort方法的两种自定义排序方式

一、Comparable接口

Comparable是一个排序接口
此接口给实现类提供了一个排序的方法,此接口有且只有一个方法(接口中没有声明public是因为接口方法默认为public,但调用该方法时必须声明public)

int compareTo(T o);

实例:通过id进行排序

public class UserInfo implements Comparable<UserInfo> {
    private int id;
    private String username;
    private String phone;
    private String otherInfo;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getOtherInfo() {
        return otherInfo;
    }

    public void setOtherInfo(String otherInfo) {
        this.otherInfo = otherInfo;
    }

    /**
     * Comparable提供的唯一一种排序方法,此方法接受任意类型的参数来进行比较(泛型)
     * @param userInfo
     * @return
     */
    @Override
    public int compareTo(UserInfo userInfo) {
        return id-userInfo.id;
    }

    @Override
    public String toString() {
        return "UserInfo{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", phone='" + phone + '\'' +
                ", otherInfo='" + otherInfo + '\'' +
                '}';
    }
}

Main方法代码:

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        UserInfo[] userInfo =new UserInfo[4];
        userInfo[0]=new UserInfo();
        userInfo[0].setId(10);
        userInfo[0].setUsername("abc");
        userInfo[1]=new UserInfo();
        userInfo[1].setId(20);
        userInfo[1].setUsername("lmn");
        userInfo[2]=new UserInfo();
        userInfo[2].setId(15);
        userInfo[2].setUsername("def");
        userInfo[3]=new UserInfo();
        userInfo[3].setId(17);
        userInfo[3].setUsername("opq");
        Arrays.sort(userInfo);
//        SortByUserName sortByUserName =new SortByUserName();
//        Arrays.sort(userInfo,sortByUserName);
        for(UserInfo i:userInfo){
            System.out.println(i);
        }
    }
}

输出结果:按id从小到大排序
在这里插入图片描述
二、Comparator接口
Comparator相当于一个比较器接口

int compare(T o1, T o2);

实例:通过username进行排序

import java.util.Comparator;

public class SortByUserName implements Comparator<UserInfo> {
	 /**
     * 重写了compare方法
     * @param t1
     * @param t2
     * @return
     */
    @Override
    public int compare(UserInfo t1, UserInfo t2) {
        return t1.getUsername().compareTo(t2.getUsername());
    }

}

Main方法代码:

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        UserInfo[] userInfo =new UserInfo[4];
        userInfo[0]=new UserInfo();
        userInfo[0].setId(10);
        userInfo[0].setUsername("abc");
        userInfo[1]=new UserInfo();
        userInfo[1].setId(20);
        userInfo[1].setUsername("lmn");
        userInfo[2]=new UserInfo();
        userInfo[2].setId(15);
        userInfo[2].setUsername("def");
        userInfo[3]=new UserInfo();
        userInfo[3].setId(17);
        userInfo[3].setUsername("opq");
        //Arrays.sort(userInfo);
        SortByUserName sortByUserName =new SortByUserName();
        Arrays.sort(userInfo,sortByUserName);
        for(UserInfo i:userInfo){
            System.out.println(i);
        }
    }
}

输出结果:按字典顺序输出username
在这里插入图片描述
另外,Comparator比较器接口允许我们自定义比较方法,打破按字典顺序比较字符串的方式比较

实例:按长度递增顺序对username对应的字符串进行排序

import java.util.Comparator;

public class SortByUserName implements Comparator<UserInfo> {
    /**
     * 重写了compare方法
     * @param t1
     * @param t2
     * @return
     */
    @Override
    public int compare(UserInfo t1, UserInfo t2) {
        return t1.getUsername().length()-t2.getUsername().length();
    }

}

Main方法代码:

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        UserInfo[] userInfo =new UserInfo[4];
        userInfo[0]=new UserInfo();
        userInfo[0].setId(10);
        userInfo[0].setUsername("000abc");
        userInfo[1]=new UserInfo();
        userInfo[1].setId(20);
        userInfo[1].setUsername("0000lmn");
        userInfo[2]=new UserInfo();
        userInfo[2].setId(15);
        userInfo[2].setUsername("00def");
        userInfo[3]=new UserInfo();
        userInfo[3].setId(17);
        userInfo[3].setUsername("opq");
        //Arrays.sort(userInfo);
        SortByUserName sortByUserName =new SortByUserName();
        //Arrays.sort(数组,比较器)
        Arrays.sort(userInfo,sortByUserName);
        for(UserInfo i:userInfo){
            System.out.println(i);
        }
    }
}

输出结果:按username所对应的字符串长度递增排序
在这里插入图片描述
三、Comparable与Comparator比较
1.Comparable接口需要被类继承的,相当于本身这个数组或者列表及类就有这 种比较方式
2.Comparator相当于给一个数组或列表新增一种比较方式

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值