[Guava源码分析]Ordering:排序
我的技术博客经常被流氓网站恶意爬取转载。请移步原文:http://www.cnblogs.com/hamhog/p/3876466.html,享受整齐的排版、有效的链接、正确的代码缩进、更好的阅读体验。
API
实例化
| 直接获得 | natural() | 自然序 |
| usingToString() | 字典序 | |
| 指定 | from(Comparator) | 包装Comparator |
| explicit(List) explicit(least, ... others) | 指明这几个东西的顺序,只排它们 | |
| 直接继承 | ||
| 其他 | allEqual() | 全相等。(稳定排序中)保持原序,可用来把null置后等 |
| arbitrary() | 任意序,似乎没什么意义。对VM周期是不变的。 |
继承写法:
Ordering<String> byLengthOrdering = new Ordering<String>() {
public int compare(String left, String right) {
return Ints.compare(left.length(), right.length());
}
};
allEqual用法:
Ordering.allEqual().nullsLast().asList(t, null, e, s, null, t, null));
//return [t, e, s, t, null, null, null]
修饰方法
链式调用
| reverse() | |
| nullsFirst() | |
| nullsLast() | |
| onResultOf(Function) | 先应用Function |
| lexicographical() | 类“字典序”,对于Iterable一位一位比下去 |
BreakTie
| compound(Comparator) |
| compound(Iterable comparators) |
应用
| min(a,b) min(a,b,c, ...rest) min(Iterator) min(Iterable) | 另有max | |
| leastOf(Iterable, int k) leastOf(Iterator, int k) | 最小的k个元素 | 另有greatestOf |
| sortedCopy(Iterable) | 返回排好的List | 另有immutableSortedCopy |
| isOrdered(Iterable) | 判断是不是已经有序 | 另有isStrictlyOrdered |
源码分析
1. 排序是怎么实现的?
natural
NaturalOrdering类
单例
compare() 直接调left.compareTo(right)
另见ReverseNaturalOrdering
以上两类reverse()方法互相转换。
toString
UsingToStringOrdering类
单例
compare()两者的toString
use comparator
ComparatorOrdering类
持有一个Comparator实例
compare()调Comparator
explicit
ExplicitOrdering类
持有一个rankMap
compare()以rank排序
others
AllEqualOrdering类
单例
compare()返回0
ArbitraryOrdering内部类
单例
compare()先比较Java给出的hashCode,如冲突用computingMap递增标记(1,2,3,4这样标下去)
2. 链式调用
典型的装饰模式,以下每个类都继承自Ordering,同时持有一个Ordering实例(大鱼吃小鱼,小鱼吃虾米)
Ordering<Foo> ordering = Ordering.natural().nullsFirst().onResultOf(sortKeyFunction)
先ByFunctionOrdering,调用sortKeyFunction.apply();然后NullsFirstOrdering,处理null;然后NaturalOrdering,调compareTo
ReverseOrdering类
compare()内层反向,逆转min、max
NullsFirstOrdering类
compare()先处理null,非null再调内层
另见NullsLastOrdering
ByFunctionOrdering类
持有Function
compare()先调function.apply(),用返回值排
LexicographicalOrdering类
compare()一位一位比过去,直到决出胜负或有一边断了
特殊:
CompoundOrdering类
持有一个Comparator List
compare()用List里的Comparator依次比较
不要把它跟别的链式调用写在一起。
3. 怎么找出最大/小的k个元素?
用到一个特殊算法。但如果要找的元素个数超过总数一半,则不用算法,而是直接排序截取,这样更快。算法适用于k远小n的情况。
算法流程:
保持一个2k大小的buffer;每次满了时,清掉较大的一半,剩下k位。
*剪枝优化:维护一个第k小的阈值,大于它的可以直接忽略了
*清掉一半的方法:快速选择。定一个标志位,比它小的挪到左边,比它大的挪到右边
时间O(n + k log k) 存储O(k)
[Guava源码分析]Ordering:排序的更多相关文章
- Guava 源码分析(Cache 原理 对象引用、事件回调)
前言 在上文「Guava 源码分析(Cache 原理)」中分析了 Guava Cache 的相关原理. 文末提到了回收机制.移除时间通知等内容,许多朋友也挺感兴趣,这次就这两个内容再来分析分析. 在开 ...
- Guava 源码分析之Cache的实现原理
Guava 源码分析之Cache的实现原理 前言 Google 出的 Guava 是 Java 核心增强的库,应用非常广泛. 我平时用的也挺频繁,这次就借助日常使用的 Cache 组件来看看 Goog ...
- [Guava源码分析]ImmutableCollection:不可变集合
摘要: 我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3888557.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的 ...
- JDK(四)JDK1.8源码分析【排序】DualPivotQuicksort
本文转载自于晓飞93,原文链接 DualPivotQuickSort 双轴快速排序 源码 笔记 DualPivotQuicksort是Arrays类中提供的给基本类型的数据排序的算法.它针对每种基本数 ...
- JDK(二)JDK1.8源码分析【排序】timsort
如无特殊说明,文中的代码均是JDK 1.8版本. 在JDK集合框架中描述过,JDK存储一组Object的集合框架是Collection.而针对Collection框架的一组操作集合体是Collecti ...
- Guava 源码分析(Cache 原理)
前言 Google 出的 Guava 是 Java 核心增强的库,应用非常广泛. 我平时用的也挺频繁,这次就借助日常使用的 Cache 组件来看看 Google 大牛们是如何设计的. 缓存 本次主要讨 ...
- JDK(三)JDK1.8源码分析【排序】mergeSort
归并排序是JDK对象数组的排序算法之一,接下来开始分析JDK的归并排序算法. /** * 将指定范围的对象数组按自然顺序升序排序 * * Src is the source array that st ...
- [Guava源码分析]Objects 和 ComparisonChain:帮助重写Object方法
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3874194.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...
- Guava 源码分析之 Beta, GwtCompatible, GwtIncompatible, Charset, HashCode
com.google.common.annotations.Beta /** * 表明一个公用API的未来版本是受不兼容变更或删除限制的 * 拥有这个注释标志的API不受任何兼容性保证 * */ @R ...
随机推荐
- MPI编程简单介绍
第三章MPI编程 3.1 MPI简单介绍 多线程是一种便捷的模型,当中每一个线程都能够訪问其他线程的存储空间.因此,这样的模型仅仅能在共享存储系统之间移植.一般来讲,并行机不一定在各处理器之间共享存储 ...
- 关于jsb中js与c++的相互调用
1.js调用c++函数 在c++中声明函数,名为functionCpp,通过spidermonkey中jsapi的JS_DefineFunction绑定一个js函数,名为functionJS,此函数名 ...
- 剑指 offer set 8 树的子结构
总结 1. 解法分为两步, 一是定位树的头结点, 二是两棵树作比较 2. 两个数作比较, 包括比较两棵树是否相等, 或者两个数是否镜像, 算法的框架类似 bool comp(root1, root2)
- P、NP、NP-Complete、NP-hard问题
Table of Contents 1 遇到难题怎么办? 2 什么是P.NP.NP-Complete和NP-hard 3 P = NP ???? 4 参考 1 遇到难题怎么办? 遇到一个问题,通常我们 ...
- C#的System.ICloneable接口说明
System.ICloneable接口支持克隆,即用与现有实例相同的值创建类的新实例.msdn上的解释很简单,主要就是clone方法的实行,介绍深拷贝和浅拷贝,搞的很糊涂,那么到底是什么意思呢?看看下 ...
- 对lua继承中self.__index = self的释疑
首先看看从lua表中查找一个键时的流程: -- 当从表t中查找键k时,lua处理如下: -- 1.t中是否有k,有则直接返回值,否则第2步 -- 2.t是否有元表, 无则返回nil, 有则第3步 -- ...
- 让Laravel5支持memcache的方法
Laravel5框架在Cache和Session中不支持Memcache,看清了是Memcache而不是Memcached哦,MemCached是支持的但是这个扩展真的是装的蛋疼,只有修改部分源码让其 ...
- sublime自己常用到的设置
一.快捷“在浏览器打开” 在首选项->按键绑定-用户中添加代码: { "keys": ["f12"], "command": &quo ...
- SQL Server远程连接操作
有时候需要在跨数据库或者跨服务器间进行操作时,可用以下代码: -- 开启远程选项 reconfigure reconfigure -- 方法1: -- 方法2: * FROM OPENROWSET(' ...
- jQuery中的渐变动画效果
jQuery中的渐变动画效果jQuery中的渐变动画效果