关于comparator升序、降序

本文详细介绍了Java中Comparator接口用于排序的实现方式,通过比较器方法compare()返回值的不同判断升序和降序。在升序排序中,返回i1-i2,而在降序排序中,返回i2-i1。此外,还通过示例代码展示了如何自定义Comparator进行Role对象的降序排序。
摘要由CSDN通过智能技术生成

1.几种情况说明: 

/**
*    排序结果为升序
*/
public int compare(int i1,int i2){
    retrun i1 - i2 ;
}

/**
*    排序结果为降序
*/
public int compare(int i1,int i2){
    retrun i2 - i1;
}

/**
*    排序结果为升序
*    定义Role类中有id属性
*/
public int compareTo(Role role){
    retrun this.id- role.id;
}

/**
*    排序结果为降序
*/
public int compareTo(Role role){
    retrun role.id- this.id;
}

为什么public int compare(int i1,int i2){...}中return i1 - i2则为升序,而return i2 -i1则为降序呢?

2.个人理解

首先我们得先了解这几个方法中的返回值大于0等于0小于0的作用是什么:

返回值小于0:升序;

返回值等于0:不做位置交换;

返回值大于0:降序;

我们一般在重写compareTo方法的时候会将小于0的情况归结为rerun -1,将大于0的情况归结为return 1;

知道上面返回值的作用后,我们可以这么理解:

/**
*    方法参数i1在i2前面,则理解成此方法定义的规则是i1 < i2
*        此时若我们要定义升序,则使此方法的返回值为小于0,则可return i1 - i2;
*        此时若我们要定义降序,则使此方法的返回值为大于0,则可return i2 - i1; 
*/
public int compare(int i1,int i2){
    ...
}

/**
*    方法参数i2在i1前面,则理解成此方法定义的规则是i2 < i1
*        此时若我们要定义升序,则使此方法的返回值为小于0,则可return i2 -i1;
*        此时若我们要定义降序,则使此方法的返回值为大于0,则可return i1 - i2;
*/
public int compare(int i2,i1){
    ...
}

/**
*    方法这样定义,则理解成this.id < role.id
*        此时若我们要定义升序,则使此方法的返回值小于0,则可return this.id - role.id
*        此时若我们要定义降序,则使此方法的返回值大于0,则可return role.id - this.id
*/
public int compareTo(Role role){
    ...
}

理解了上面方法怎么写,就定义了怎样的规则后,我们就可以理解第一部分中升序、降序是怎么定义的。

3.测试代码

@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
@Accessors(chain = true)
public class Role {

    private Long id;
    private Long insertTime;
    private Long updateTime;
    private String roleName;


    public static void main(String[] args) {

        Role build1 = Role.builder().id(10L).build();
        Role build2 = Role.builder().id(15L).build();
        Role build3 = Role.builder().id(5L).build();

        TreeSet<Role> roles = new TreeSet<Role>(new Comparator<Role>() {
            @Override
            public int compare(Role o1, Role o2) {
                Integer i1 = Integer.parseInt(String.valueOf(o1.id));
                Integer i2 = Integer.parseInt(String.valueOf(o2.id));
               //因为o1.id<o2.id,即i1<i2
               //所以定义降序只需将返回值定义为大于0即可
               //输出结果为降序
                return i2-i1;
            }
        }) {
            {
                this.add(build1);
                this.add(build2);
                this.add(build3);
            }
        };


        for (Role role : roles) {
            System.out.println(role);
        }
    }
}
===================输出结果===================
Role(id=15, insertTime=null, updateTime=null, roleName=null)
Role(id=10, insertTime=null, updateTime=null, roleName=null)
Role(id=5, insertTime=null, updateTime=null, roleName=null)

 

  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值