可能是最简单最通透的Comparable和Comparator接口返回值理解
先说 Comparator 接口,这个理解了,下一个就理解了
一、Comparator 的用法(暂不考虑0,因为0不处理)
返回-1,1交换不交换位置,如果撇开比较器的两个参数和jdk默认顺序来说,存粹是错误的
接口如下:原文链接
public interface Comparator<T> {
int compare(T o1, T o2);
}
现提出如下标准:
- 标准1:jdk 默认要升序排列,即程序排序规则是
asc,升序排列 - 标准2:
Comparator接口第一个参数o1是第二个参数o2后面的对象
基于这 2 个标准,假设:
- 1 = true
- -1 = false
重点来了,有以下两种情况和处理方式:
- 情况1:后面的比前面大,即
o1 > o2,是标准1中的升序吗?是,返回 true,不交换前后位置。 - 情况2:后面的比前面小,即
o1 < o2,是标准1中的升序吗?不是,返回 false, 交换前后位置。
问:为什么第二种降序要交换前后位置?
答:因为 标准1 ,默认要对数组进行升序排列,如果发现降序的序列,自然要交换位置
扩散问题1:如果我想按降序排列呢?
答:那你就在升序时候返回 false,降序时候返回 true 就行
扩散问题2:如果我不比较,直接返回1或者-1呢?
答:因为标准1,返回1(true)代表都是升序,自然不必交换,返回-1(false)代表都不是升序,都要交换,即数组反转
总结:
想要升序排列,如果比较器2个参数是升序排列,就返回true,否则返回false即可
想要降序排列,如果比较器2个参数是降序排列,就返回true,否则返回false即可
附测试代码:
public class ComparatorDemo {
private final int local;
public ComparatorDemo(int local) {
this.local = local;
}
@Override
public String toString() {
return "" + local;
}
public static void main(String[] args) {
List<ComparatorDemo> asc = new ArrayList<>();
asc.add(new ComparatorDemo(13));
asc.add(new ComparatorDemo(3));
asc.add(new ComparatorDemo(15));
asc.add(new ComparatorDemo(18));
// 我想升序排列
asc.sort((second,first) -> {
if(second.local > first.local){
return 1; //是升序,返回true
}else if(second.local < first.local){
return -1; //是降序,返回false
}else {
return 0;
}
});
System.out.print("升序数组:");
System.out.println(asc);
List<ComparatorDemo> desc = new ArrayList<>();
desc.add(new ComparatorDemo(13));
desc.add(new ComparatorDemo(3));
desc.add(new ComparatorDemo(15));
desc.add(new ComparatorDemo(18));
// 我想降序排列
desc.sort((o1,o2) -> {
if(o1.local > o2.local){
return -1; //不是降序,返回false
}else if(o1.local < o2.local){
return 1; //是降序,返回true
}else {
return 0;
}
});
System.out.print("降序数组:");
System.out.println(desc);
}
}
二、Comparable 的用法(暂不考虑0,因为0不处理)
规则和 Comparator 一样,只需把当前 Comparable 实例当成Comparator#compare(T o1, T o2)第一个参数即可
测试代码:
public class ComparableImpl implements Comparable<ComparableImpl> {
private final Integer local;
public ComparableImpl(Integer num) {
this.local = num;
}
@Override
public String toString() {
return "" + local;
}
@Override
public int compareTo(ComparableImpl before) {
if (local > before.local) {
return 1; //是升序
} else if (local < before.local) {
return -1; //是降序
}
return 0;
}
public static void main(String[] args) {
ComparableImpl[] ables = new ComparableImpl[]{
new ComparableImpl(1),
new ComparableImpl(13),
new ComparableImpl(25),
new ComparableImpl(4),
};
Arrays.sort(ables);
System.out.println(Arrays.toString(ables));
}
}
可能是最简单最通透的Comparable和Comparator接口返回值理解的更多相关文章
- 一直对zookeeper的应用和原理比较迷糊,今天看一篇文章,讲得很通透,分享如下(转)
本文转自http://blog.csdn.net/gs80140/article/details/51496925 一直对zookeeper的应用和原理比较迷糊,今天看一篇文章,讲得很通透,分享如下: ...
- [No000062]读书八字诀:怎样将书读得通透?
从吃透到通透 有种说法,吃透一本书,才算好好读过.然而比吃透境界更高,是通透.吃透仅限于书中内容,通透则是将书中内容与正反上下.古今中外背景知识相互关联. 当你做到读书通透,收获将远远大于手头那一本书 ...
- 看完这篇 Linux 权限后,通透了!
我们在使用 Linux 的过程中,或多或少都会遇到一些关于使用者和群组的问题,比如最常见的你想要在某个路径下执行某个指令,会经常出现这个错误提示 . permission denied 反正我大概率见 ...
- 赌十包辣条,你一定没见过这么通透的ThreadLocal讲解
1.看个热闹 鉴于普罗大众都喜欢看热闹,咱们先来看个热闹再开工吧! 场景一: 中午了, 张三.李四和王五一起去食堂大菜吃饭.食堂刚经营不久,还很简陋,负责打菜的只有一位老阿姨. 张三:我要一份鸡腿. ...
- 全网最通透的Java8版本特性讲解
「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...
- 简单介绍如何使用PowerMock和Mockito来mock 1. 构造函数 2. 静态函数 3. 枚举实现的单例 4. 选择参数值做为函数的返回值(转)
本文将简单介绍如何使用PowerMock和Mockito来mock1. 构造函数2. 静态函数3. 枚举实现的单例4. 选择参数值做为函数的返回值5. 在调用mock出来的方法中,改变方法参数的值 一 ...
- 用Java构建一个简单的WebSocket聊天项目之新增HTTP接口调度
采用框架 我们整个Demo基本不需要大家花费太多时间,就可以实现以下的功能. 用户token登录校验 自我聊天 点对点聊天 群聊 获取在线用户数与用户标签列表 发送系统通知 首先,我们需要介绍一下我们 ...
- 简单架构:反射实现抽象工厂+IDAL接口完全独立DAL
一.普通架构中存在的问题 StudentDB数据库,包含一张StudentInfoTB表,结构如下: s_id int primary key identity(1,1), s_name Nvarch ...
- java:面向对象(多态,final,抽象方法,(简单工厂模式即静态方法模式),接口)
* 生活中的多态:同一种物质,因环境不同而表现不同的形态. * 程序中多态:同一个"接口",因不同的实现而执行不同的操作. * 多态和方法的重写经常结合使用,子类重写父类的方法,将 ...
- 通透,23 个问题 TCP 疑难杂症全解析
每个时代,都不会亏待会学习的人. 在进入今天主题之前我先抛几个问题,这篇文章一共提出 23 个问题. TCP 握手一定是三次?TCP 挥手一定是四次? 为什么要有快速重传,超时重传不够用?为什么要有 ...
随机推荐
- 分布式事务组件Seata
介绍 一阶段:事务协调者通知每一个服务处理本地事务,每个服务开始处理但是不会提交事务,处理完毕后告知协调者. 二阶段:协调者收到所有服务的消息后通知他们提交事务. 重要角色 事务管理器(TM),决 ...
- day11-SpringBoot中注入Servlet&Filter&Listener
SpringBoot中注入Servlet&Filter&Listener 1.基本介绍 文档:SpringBoot中注入Servlet&Filter&Listener ...
- ML-程序练习-Dragon
回归问题 前期 假设已有某样例,参数为w=1.477, b=0.089,即为\(y=1.477x+0.089\) 过程分析 数据采样 首先我们需要模拟一些带有真实样本观测误差的数据(因为真实情况是真实 ...
- 【原创】Ubuntu Pro 中的RealTime linux(Real-time Ubuntu/PREEMPT-RT/ubuntu官方PREEMPT-RT)
[原创]Ubuntu Pro 订阅中的realtime linux(Real-time Ubuntu/PREEMPT-RT) 目录 [原创]Ubuntu Pro 订阅中的realtime linux( ...
- 刷爆 LeetCode 周赛 339,贪心 / 排序 / 拓扑排序 / 平衡二叉树
本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,我是小彭. 上周末是 LeetCode 第 339 场周赛,你参加了吗?这场周赛覆盖的知识点比较少, ...
- [灾备]独立磁盘阵列(RAID)技术
本文是对3个月前临时出差前往客户现场,安装交付我司大数据产品时使用的一项硬件级的灾备技术的简要复盘. 1 独立磁盘阵列--RAID:概述 1.1 定义 RAID := Redundant Arrays ...
- @property、关联关系、继承、多继承
1.@property使用来修饰属性的,将属性私有化改为公有化,但是可以设置属性条件 格式: class Person: def __init__(self,name,age): self.name ...
- 多进程和多线程,Thread模块 GIL全局解释锁, 进程池与线程池,协程
1.多进程实现TCP服务端并发: import socket from multiprocessing import Process def get_server(): server = socket ...
- Numpy浅拷贝与深拷贝
Numpy中的浅拷贝与深拷贝 浅拷贝 共享内存地址的两个变量,当其中一个变量的值改变时另外一个也随之改变. Example a = np.array([1, 2, 3, 4, 5]) b = a pr ...
- 扒一扒Nacos、OpenFeign、Ribbon、loadbalancer组件协调工作的原理
大家好,我是三友~~ 前几天有个大兄弟问了我一个问题,注册中心要集成SpringCloud,想实现SpringCloud的负载均衡,需要实现哪些接口和规范. 既然这个兄弟问到我了,而我又刚好知道,这不 ...