我的技术博客经常被流氓网站恶意爬取转载。请移步原文: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:排序的更多相关文章

  1. Guava 源码分析(Cache 原理 对象引用、事件回调)

    前言 在上文「Guava 源码分析(Cache 原理)」中分析了 Guava Cache 的相关原理. 文末提到了回收机制.移除时间通知等内容,许多朋友也挺感兴趣,这次就这两个内容再来分析分析. 在开 ...

  2. Guava 源码分析之Cache的实现原理

    Guava 源码分析之Cache的实现原理 前言 Google 出的 Guava 是 Java 核心增强的库,应用非常广泛. 我平时用的也挺频繁,这次就借助日常使用的 Cache 组件来看看 Goog ...

  3. [Guava源码分析]ImmutableCollection:不可变集合

    摘要: 我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3888557.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的 ...

  4. JDK(四)JDK1.8源码分析【排序】DualPivotQuicksort

    本文转载自于晓飞93,原文链接 DualPivotQuickSort 双轴快速排序 源码 笔记 DualPivotQuicksort是Arrays类中提供的给基本类型的数据排序的算法.它针对每种基本数 ...

  5. JDK(二)JDK1.8源码分析【排序】timsort

    如无特殊说明,文中的代码均是JDK 1.8版本. 在JDK集合框架中描述过,JDK存储一组Object的集合框架是Collection.而针对Collection框架的一组操作集合体是Collecti ...

  6. Guava 源码分析(Cache 原理)

    前言 Google 出的 Guava 是 Java 核心增强的库,应用非常广泛. 我平时用的也挺频繁,这次就借助日常使用的 Cache 组件来看看 Google 大牛们是如何设计的. 缓存 本次主要讨 ...

  7. JDK(三)JDK1.8源码分析【排序】mergeSort

    归并排序是JDK对象数组的排序算法之一,接下来开始分析JDK的归并排序算法. /** * 将指定范围的对象数组按自然顺序升序排序 * * Src is the source array that st ...

  8. [Guava源码分析]Objects 和 ComparisonChain:帮助重写Object方法

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3874194.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...

  9. Guava 源码分析之 Beta, GwtCompatible, GwtIncompatible, Charset, HashCode

    com.google.common.annotations.Beta /** * 表明一个公用API的未来版本是受不兼容变更或删除限制的 * 拥有这个注释标志的API不受任何兼容性保证 * */ @R ...

随机推荐

  1. Lvalue, Rvalue, Xvalue, Prvalue, Glvalue

    c++11中关于什么是lvalue, 什么是rvalue, 什么是xvalue, 什么是prvalue, 什么是… 一直搞得我晕头转向的, 今天下定决心一定要把它搞定, 写了一个程序来判断lvalue ...

  2. because it is not a variable 编译错误解决方案

    1,将Stuct换为class 2,使用中间变量, 如Point p=new Point(x,y); this.Location=p; 而不能直接给struct赋值,因为值类型是不能改变的,必须生成新 ...

  3. 使用SQL*PLUS,构建完美excel或html输出

    通过SQL*PLUS我们可以构建友好的输出,满足多样化用户需求.本例通过简单示例,介绍通过sql*plus输出xls,html两种格式文件.首先创建两个脚本:1.main.sql用以设置环境,调用具体 ...

  4. 用komodo建立python开发环境

    配置 在菜单中选择Edit.Preferences. 代码自动完成 更改tab代表的空格数 括号自动关闭和语法检查 interactive shell 中文支持 缩写 点击菜单View.Tabs &a ...

  5. .NET和SQL Server中“空值”辨析 (DBNull与Null的区别)

    对表进行插入操作,如datetime和int类型的两个字段,都允许为null,用“sqlcmd.Parameters.Add("@t12",tb12.Text)”参数绑定时.dat ...

  6. Cable master(二分题 注意精度)

    Cable master Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 26596   Accepted: 5673 Des ...

  7. JSONP 跨域解决办法

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  8. ios -几种常见定时器

    转自cocoachina 网友分享: http://mp.weixin.qq.com/s?__biz=MjM5OTM0MzIwMQ==&mid=206637839&idx=7& ...

  9. Java Script基础(十) 访问样式表

    动态控制样式表 在JavaScript中,有两种方式可以动态的改变样式属性,一种是使用style属性,另一种是使用样式的className属性.另外控制元素隐藏和显示使用display属性. 1.使用 ...

  10. log4net日志文件名输出格式化

    日志文件输出格式: 20130626.txt20130627.txt20130628.txt20130629.txt <appender name="rolling" typ ...