[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 ...
随机推荐
- Lvalue, Rvalue, Xvalue, Prvalue, Glvalue
c++11中关于什么是lvalue, 什么是rvalue, 什么是xvalue, 什么是prvalue, 什么是… 一直搞得我晕头转向的, 今天下定决心一定要把它搞定, 写了一个程序来判断lvalue ...
- because it is not a variable 编译错误解决方案
1,将Stuct换为class 2,使用中间变量, 如Point p=new Point(x,y); this.Location=p; 而不能直接给struct赋值,因为值类型是不能改变的,必须生成新 ...
- 使用SQL*PLUS,构建完美excel或html输出
通过SQL*PLUS我们可以构建友好的输出,满足多样化用户需求.本例通过简单示例,介绍通过sql*plus输出xls,html两种格式文件.首先创建两个脚本:1.main.sql用以设置环境,调用具体 ...
- 用komodo建立python开发环境
配置 在菜单中选择Edit.Preferences. 代码自动完成 更改tab代表的空格数 括号自动关闭和语法检查 interactive shell 中文支持 缩写 点击菜单View.Tabs &a ...
- .NET和SQL Server中“空值”辨析 (DBNull与Null的区别)
对表进行插入操作,如datetime和int类型的两个字段,都允许为null,用“sqlcmd.Parameters.Add("@t12",tb12.Text)”参数绑定时.dat ...
- Cable master(二分题 注意精度)
Cable master Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 26596 Accepted: 5673 Des ...
- JSONP 跨域解决办法
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- ios -几种常见定时器
转自cocoachina 网友分享: http://mp.weixin.qq.com/s?__biz=MjM5OTM0MzIwMQ==&mid=206637839&idx=7& ...
- Java Script基础(十) 访问样式表
动态控制样式表 在JavaScript中,有两种方式可以动态的改变样式属性,一种是使用style属性,另一种是使用样式的className属性.另外控制元素隐藏和显示使用display属性. 1.使用 ...
- log4net日志文件名输出格式化
日志文件输出格式: 20130626.txt20130627.txt20130628.txt20130629.txt <appender name="rolling" typ ...