[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 ...
随机推荐
- 一道模板元编程题源码解答(replace_type)
今天有一同学在群上聊到一个比较好玩的题目(本人看书不多,后面才知是<C++模板元编程>第二章里面的一道习题), 我也抱着试一试的态度去完成它, 这道题也体现了c++模板元编程的基础和精髓: ...
- Linux用户空间与内核空间(理解高端内存)
Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数 ...
- [vba]excel中求选中数据和为给定数所有的组合
昨天下午开始学习的vba,累死了,肯定有bug,待调试 vba程序如下: Dim aSum As Integer Dim tSum As Integer ) As Integer Dim arrMax ...
- RosettaNet
RosettaNet 这一名字源自于 1799 年在埃及发现的 Rosetta Stone .这要追溯到公元前 196 年,该石头是在 Rosetta (Rashid) 镇附近被人发现的,上面用两种不 ...
- 配置apache、php、mysql之间的关系
1.index.php文件放入/usr/local/apache2/htdocs 目录下 其中index.php里面内容为: <?php phpinfo(); $dbc= mysql_conne ...
- LeetCode23 Merge k Sorted Lists
题意: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexit ...
- VSS 之 未知的用户名或密码错误
原因:导致这种现象的原因并不是真的用户名和密码错误,而是验证失败.验证失败也自然就会提示成用户名或密码错误了,只需要做以下更改就能正常验证用户名和密码了.解决方案:运行 组策略编辑器 gpedit.m ...
- ios 加载本地html css文件 ps:css和html必须在同一文件夹下面
NSString *path = [[NSBundle mainBundle] bundlePath]; NSURL *baseURL = [NSURL fileURLWithPath:path]; ...
- Android(java)学习笔记264:Android下的属性动画高级用法(Property Animation)
1. 大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法,当然也是最常用的一些用法,这些用法足以覆盖我们平时大多情况下的动画需求了.但是,正如上篇文章当中所说到的,属性动画对补间动画 ...
- 使用手机模拟器与android操作系统
创建手机模拟器: 1. 点击Eclipse中新增的按钮,打开"Android Virtual Device Manager"(不同版本的ADT可能打开路径不同),如下图: 2. 点 ...