Java 排序问题

算法中经常有排序,有时候很模糊,所以做如下总结
比较有3中情况
o1(前一个) vs o2(后一个)
return 1 o1>o2 交换
return 0 o1=o2
return -1 o1<o2 不交换

public class SortTest {

    public static void main(String[] args) {
        ArrayList<Integer> ints = new ArrayList<>();
        ints.add(2);
        ints.add(4);
        ints.add(1);
        ints.add(3);

        ArrayList<Integer> ints1 = new ArrayList<>(ints);
        ArrayList<Integer> ints2 = new ArrayList<>(ints);
        System.out.println("排序前 :" + ints1);
        //升序
        asc(ints1);

        System.out.println("排序前 :" + ints2);
        //降序
        desc(ints2);
    }

    //升序
    private static void asc(ArrayList<Integer> ints) {
        Collections.sort(ints, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {

                // return ascMethod1(o1,o2);
                // return ascMethod2(o1,o2);
                // return ascMethod3(o1,o2);
               
            }

            private int ascMethod1(Integer o1, Integer o2) {
                //升序
                if(o1!=o2){
                    if(o1>o2){
                        //前一个 > 后一个,需要交换  return 1
                        return o1-o2;
                    }else if(o1<o2){
                        //前一个 < 后一个,不需要交换  return -1
                        return o1-o2;
                    }
                }
                return 0;
            }

            private int ascMethod2(Integer o1, Integer o2) {
                //升序,总结 ascMethod1
                if(o1!=o2){
                    return o1-o2;
                }
                return 0;
            }

            private int ascMethod3(Integer o1, Integer o2) {
                //升序 api调用
                if(o1!=o2){
                  return Integer.compare(o1,o2);
                }
                return 0;
            }

        });
        System.out.println("升序后 :" + ints);
    }



    //降序
    private static void desc(ArrayList<Integer> ints) {
        Collections.sort(ints, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                // return descMethod1(o1, o2);
                // return descMethod2(o1, o2);
               return descMethod3(o1, o2);
            }
            
            private int descMethod1(Integer o1, Integer o2) {
                if (o1 != o2) {
                    if (o1 > o2) {
                        //前一个 大于 后一个 不用交换   return -1
                        return o2 - o1;
                    } else if (o1 < o2) {
                        //前一个 小于 后一个 交换  return 1
                        return o2-o1;
                    }
                }
                return 0;
            }

            private int descMethod2(Integer o1, Integer o2) {
                //归纳 descMethod1
                if (o1 != o2) {
                    return o2-o1;
                }
                return 0;
            }

            private int descMethod3(Integer o1, Integer o2) {
                //调用api
                if (o1 != o2) {
                    return Integer.compare(o2,o1);
                }
                return 0;
            }

        });
        System.out.println("降序后 :" + ints);
    }

输出结果
排序前 :[2, 4, 1, 3]
升序后 :[1, 2, 3, 4]
排序前 :[2, 4, 1, 3]
降序后 :[4, 3, 2, 1]

总结:
升序 前一个 大于 后一个 交换
Integer.compare(o1,o2);
降序 后一个 大于 前一个 交换
Integer.compare(o2,o1);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值