Comparator的compare方法如何定义升序降序
最近做算法题用了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方法如何定义升序降序相关推荐
- Comparator::compare设定排序的升序 降序
java.util.Comparator中 compare(T o1, T o2) 函数,其实现决定升序降序.举例如下:对某个对象的var类例进行排序 int compare(T o1, T o2) ...
- Comparator中compare方法的使用
Comparator中compare方法的使用 首先要明确Comparator是一个函数式接口(有@FunctionalInterface注解),说明可以使用Lambda表达式完成比较操作,并且其中T ...
- Java的Comparator排序(升序降序)理解
Java的Comparator排序(升序降序)理解 int compare(T o1, T o2); 这里o1表示位于前面的对象,o2表示后面的对象 返回-1(或负数),表示不需要交换01和02的位置 ...
- 比较器Compare升序降序
package com.itheima.d1_set; /*判断比较器compare升序降序 */import sun.plugin.javascript.navig.Array;import jav ...
- JAVA中返回值为字母时_LeetCode#524通过删除字母匹配到字典里最长单词-java中CompareTo方法用法以及Comparator中Compare方法返回值...
import java.util.Collections; import java.util.Comparator; import java.util.List; /* 524. 通过删除字母匹配到字 ...
- java升序降序排列desc,TreeMap升序|降序排列和按照value进行排序
TreeMap 升序|降序排列 import java.util.Comparator; import java.util.TreeMap; public class Main { public st ...
- js:数组对象按key值进行升序降序排序
1.先定义一个数组对象 let arr=[{name:'李欣',age:'18'},{name:'王钊',age:'15'},{name:'李雪',age:'20'},{name:'李逍遥',age: ...
- java treemap value排序_Java TreeMap升序|降序排列和按照value进行排序的案例
TreeMap 升序|降序排列 import java.util.Comparator; import java.util.TreeMap; public class Main { public st ...
- 先用总分升序再用计算机降序,怎样用升序降序给EXCEL排名
怎样用升序降序给EXCEL排名 (2008-12-14 16:35:01) 标签: 电脑 单元格 数据清单 h2 if 教育 在用Excel制作相关的数据表格时,我们可以利用其强大的排序功能,浏览.查 ...
最新文章
- R语言Wilcoxon Signed-rank统计分布函数(dsignrank, psignrank, qsignrank rsignrank )实战
- 怎么把两个不同的属性值进行比较_DDD实战与进阶 值对象
- 归档—监控ORACLE数据库告警日志
- BZOJ 2752: [HAOI2012]高速公路(road)
- gh0st源码分析与远控的编写(一)
- 使用Spring 3.1和基于Java的配置构建RESTful Web服务,第2部分
- [html] 说说你对cookie和session的理解
- linux中磁盘的iused,Linux 磁盘与文件系统管理
- js判断对象为空_在 JavaScript 中如何检查对象为空
- 【机器学习笔记】使用lightgbm画并保存Feature Importance
- matplotlib之简单动画制作
- java opencv 模板匹配算法_OpenCV模板匹配算法详解
- canvas系列 — canvas常用API介绍
- 敏捷开发中团队如何面对失败的Sprint
- 现货白银如何计算盈亏
- linux下文件属性drwxr-xr-x各是什么意思
- 网络直播平台近些年发展
- ppt压缩文件怎么压缩最小,ppt无损压缩
- 学习java看什么论坛比较好
- PPT修改幻灯片大小