[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 ...
随机推荐
- CHECKPOINT
http://blog.csdn.net/chenlvzhou/article/details/41518979
- errno多线程安全(转载)
一.errno的由来 在C编程中,errno是个不可缺少的变量,特别是在网络编程中.如果你没有用过errno,那只能说明你的程序不够健壮.当然,如果你是WIN32平台的GetLastError ...
- 词法分析器Demo
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Lexe ...
- iPhone重绘机制drawRect
如何使用iPhone进行绘图.重绘操作iPhone的绘图操作是在UIView类的drawRect方法中完成的,所以如果我们要想在一个UIView中绘图,需要写一个扩展UIView 的类,并重写draw ...
- 适配iOS9遇到的一些问题_Scheme白名单_ Bitcode及解决办法
升级Xcode7 运行项目发现报错如下: 1.Scheme白名单问题 -canOpenURL: failed for URL: “weixin://app/wxdaae92a9cfe5d54c/” - ...
- Data Structure 之 最优二叉树
给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近. ...
- 【Android 界面效果26】listview android:cacheColorHint,android:listSelector属性作用
ListView是常用的显示控件,默认背景是和系统窗口一样的透明色,如果给ListView加上背景图片,或者背景颜色时,滚动时listView会黑掉, 原因是,滚动时,列表里面的view重绘时,用的依 ...
- 自定义EditText实现一键删除数据
转载请注明出处http://blog.csdn.net/xiaanming/article/details/11066685 自定义EditText带删除小图标, 实现的功能: 点击删除小图标,删除当 ...
- python 基础——私有属性
私有属性 python 私有属性以两个下划线开头. python 私有属性只能在类内部访问,类外面访问会出错. python 私有属性之所以不能在外面直接通过名称来访问,其实质是因为 python 做 ...
- [转]div 让文字或图片居中
本文转自:http://qsfwy.iteye.com/blog/250206 在div 中让 文字或图片居中,请参考以下代码1: - - - - - - - - - - - - - - - - - ...