最近做算法题用了Comparator接口下的compare方法,思考了一下升序和降序的规则是如何来的,现在做一个补充,方便以后回顾。

 升序代码

    public static void main(String[] args) {Integer[] nums = new Integer[]{6, 8, 3, 0, 2};Arrays.sort(nums, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o1 - o2;}});for (Integer i : nums) {System.out.print(i + "  ");}}

降序代码

    public static void main(String[] args) {Integer[] nums = new Integer[]{6, 8, 3, 0, 2};Arrays.sort(nums, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1;}});for (Integer i : nums) {System.out.print(i + "  ");}}

所以更多时候我们是直接记住了compare(int o1, int o2)方法 return o1 - o2 是升序,return o2 - o1 是降序。那么原因我们不妨跳进去源码看一下

    public static <T> void sort(T[] a, Comparator<? super T> c) {if (c == null) {sort(a);} else {if (LegacyMergeSort.userRequested)legacyMergeSort(a, c);elseTimSort.sort(a, 0, a.length, c, null, 0, 0);}}

可以看出他是进去了else内,不妨先进入legacyMergeSort看一下

    private static <T> void legacyMergeSort(T[] a, Comparator<? super T> c) {T[] aux = a.clone();if (c==null)mergeSort(aux, a, 0, a.length, 0);elsemergeSort(aux, a, 0, a.length, 0, c);}

这里很明显也是进去了else内,继续看mergeSort

    private static void mergeSort(Object[] src,Object[] dest,int low, int high, int off,Comparator c) {int length = high - low;// Insertion sort on smallest arraysif (length < INSERTIONSORT_THRESHOLD) {for (int i=low; i<high; i++)for (int j=i; j>low && c.compare(dest[j-1], dest[j])>0; j--)swap(dest, j, j-1);return;}// Recursively sort halves of dest into srcint destLow  = low;int destHigh = high;low  += off;high += off;int mid = (low + high) >>> 1;mergeSort(dest, src, low, mid, -off, c);mergeSort(dest, src, mid, high, -off, c);// If list is already sorted, just copy from src to dest.  This is an// optimization that results in faster sorts for nearly ordered lists.if (c.compare(src[mid-1], src[mid]) <= 0) {System.arraycopy(src, low, dest, destLow, length);return;}// Merge sorted halves (now in src) into destfor(int i = destLow, p = low, q = mid; i < destHigh; i++) {if (q >= high || p < mid && c.compare(src[p], src[q]) <= 0)dest[i] = src[p++];elsedest[i] = src[q++];}}

这一段的代码关键就是如下部分

        if (length < INSERTIONSORT_THRESHOLD) {for (int i=low; i<high; i++)for (int j=i; j>low && c.compare(dest[j-1], dest[j])>0; j--)swap(dest, j, j-1);return;}

可以看到这里面调用了compare方法,当方法的返回值大于0的时候就将数组的前一个数和后一个数做交换。以升序为例来讲解,升序的话compare方法就 return o1 - o2,那么就是 return dest[j-1] - dest[j]。

当 dest[j-1] > dest[j] 时,就进行交换。当 dest[j-1] <= dest[j] 时位置不变,从而达到数组升序。降序也是一样的道理,就不多讲了。

Comparator的compare方法如何定义升序降序相关推荐

  1. Comparator::compare设定排序的升序 降序

    java.util.Comparator中 compare(T o1, T o2) 函数,其实现决定升序降序.举例如下:对某个对象的var类例进行排序 int compare(T o1, T o2) ...

  2. Comparator中compare方法的使用

    Comparator中compare方法的使用 首先要明确Comparator是一个函数式接口(有@FunctionalInterface注解),说明可以使用Lambda表达式完成比较操作,并且其中T ...

  3. Java的Comparator排序(升序降序)理解

    Java的Comparator排序(升序降序)理解 int compare(T o1, T o2); 这里o1表示位于前面的对象,o2表示后面的对象 返回-1(或负数),表示不需要交换01和02的位置 ...

  4. 比较器Compare升序降序

    package com.itheima.d1_set; /*判断比较器compare升序降序 */import sun.plugin.javascript.navig.Array;import jav ...

  5. JAVA中返回值为字母时_LeetCode#524通过删除字母匹配到字典里最长单词-java中CompareTo方法用法以及Comparator中Compare方法返回值...

    import java.util.Collections; import java.util.Comparator; import java.util.List; /* 524. 通过删除字母匹配到字 ...

  6. java升序降序排列desc,TreeMap升序|降序排列和按照value进行排序

    TreeMap 升序|降序排列 import java.util.Comparator; import java.util.TreeMap; public class Main { public st ...

  7. js:数组对象按key值进行升序降序排序

    1.先定义一个数组对象 let arr=[{name:'李欣',age:'18'},{name:'王钊',age:'15'},{name:'李雪',age:'20'},{name:'李逍遥',age: ...

  8. java treemap value排序_Java TreeMap升序|降序排列和按照value进行排序的案例

    TreeMap 升序|降序排列 import java.util.Comparator; import java.util.TreeMap; public class Main { public st ...

  9. 先用总分升序再用计算机降序,怎样用升序降序给EXCEL排名

    怎样用升序降序给EXCEL排名 (2008-12-14 16:35:01) 标签: 电脑 单元格 数据清单 h2 if 教育 在用Excel制作相关的数据表格时,我们可以利用其强大的排序功能,浏览.查 ...

最新文章

  1. R语言Wilcoxon Signed-rank统计分布函数(dsignrank, psignrank, qsignrank rsignrank )实战
  2. 怎么把两个不同的属性值进行比较_DDD实战与进阶 值对象
  3. 归档—监控ORACLE数据库告警日志
  4. BZOJ 2752: [HAOI2012]高速公路(road)
  5. gh0st源码分析与远控的编写(一)
  6. 使用Spring 3.1和基于Java的配置构建RESTful Web服务,第2部分
  7. [html] 说说你对cookie和session的理解
  8. linux中磁盘的iused,Linux 磁盘与文件系统管理
  9. js判断对象为空_在 JavaScript 中如何检查对象为空
  10. 【机器学习笔记】使用lightgbm画并保存Feature Importance
  11. matplotlib之简单动画制作
  12. java opencv 模板匹配算法_OpenCV模板匹配算法详解
  13. canvas系列 — canvas常用API介绍
  14. 敏捷开发中团队如何面对失败的Sprint
  15. 现货白银如何计算盈亏
  16. linux下文件属性drwxr-xr-x各是什么意思
  17. 网络直播平台近些年发展
  18. ppt压缩文件怎么压缩最小,ppt无损压缩
  19. 学习java看什么论坛比较好
  20. PPT修改幻灯片大小

热门文章

  1. bigdecimal负数变正数_BigDecimal的用法详解
  2. 【GAMS与C++的交互】
  3. 电源基础(凌特资料)
  4. Java程序员如何查看本机连接过的 WiFi 和密码
  5. 解决 Mac-osx Capitan 关闭Rootlees 安装 chromedriver
  6. 新学生管理系统(一)登陆界面
  7. 国产smartbits版本-minismb测试高恪路由器IP限速
  8. Android cpu架构类型升级方案调研
  9. sql企业人士管理系统前端html,hrm.sql
  10. 遗传算法配送路径优化java_基于遗传算法的配送中心路径优化问题分析