Guava中Range和Cut简介

Guava中用Range类表示区间,Range中的两个端点是Cut类实例,形如:

public final class Range <C extends java.lang.Comparable> implements com.google.common.base.Predicate<C>, java.io.Serializable {
    ...//其他数据
    final com.google.common.collect.Cut<C> lowerBound;
    final com.google.common.collect.Cut<C> upperBound;
    ...//其他方法
}

对于Range来说,对应数学上几种类型的区间:

数学形式 Range对应的创建函数
(a..b) Range.open(C, C)
[a..b] Range.closed(C, C)
[a..b) Range.closedOpen(C, C)
(a..b] Range.openClosed(C, C)
(a..+∞) Range.greaterThan(C)
[a..+∞) Range. atLeast(C)
(-∞..b) Range.lessThan(C)
(-∞..b] Range.atMost(C)
(-∞..+∞) Range.all()

需要注意的是,Range的构造函数为private,除了用以上方式创建,还可以显示指定两端的包含情况,使用:

区间描述 Range对应的创建函数
显示确定两端是否包含 range(C, BoundType, C, BoundType)
从端点到正无穷 ((a..+∞) or [a..+∞)) downTo(C, BoundType)
从端点到负无穷 ((-∞..b) or (-∞..b]) upTo(C, BoundType)

BoundType是枚举类型,定义了OPEN和CLOSED,代码如下:

public enum BoundType {
    OPEN {
        BoundType flip() {
            return CLOSED;
        }
    },
    CLOSED {
        BoundType flip() {
            return OPEN;
        }
    };
    private BoundType() {
    }
    static BoundType forBoolean(boolean inclusive) {
        return inclusive?CLOSED:OPEN;
    }
    abstract BoundType flip();
}

Range实例可以通过lowerBoundType()和upperBoundType()方法获得两端的BoundType。

Range类中比较有用的几个方法

方法签名 方法描述
public boolean encloses(Range other) 判断是否完全包含other区间
public boolean isConnected(Range other) 判断是否和other区间是否连接,边界点一开一闭也算连接
public Range intersection(Range other) 求和other之间的最小的区间,相当于求交
public Range span(Range other) 求和other区间能完全包含两区间的最小区间,相当于求并

Cut是一个抽象类

abstract class Cut<C extends Comparable> implements Comparable<Cut<C>>, Serializable {
    final C endpoint;
    ...//其他东西
}

内部只保存一个端点数据。在Cut内部有四个内部类,要拿到实例只能返回几个继承Cut的内部类(private static final class),分别表示普通的 BelowValue,AboveValue,BelowAll,AboveAll,其中后两个在内部还各有一个 static final 的 INSTANCE,用来表示最高(低),反正是最,只需要一个。这些类实现 Cut 的虚函数。

参考链接:

[1]http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Range.html

[2]https://code.google.com/p/guava-libraries/wiki/RangesExplained

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-08 17:07:53

Guava中Range和Cut简介的相关文章

Guava学习笔记:guava中的Preconditions使用

Guava学习笔记:guava中的Preconditions使用 转载:http://outofmemory.cn/java/guava/base/Preconditions google guava的base包中提供的Preconditions类用来方便的做参数的校验,他主要提供如下方法: checkArgument 接受一个boolean类型的参数和一个可选的errorMsg参数,这个方法用来判断参数是否符合某种条件,符合什么条件google guava不关心,在不符合条件时会抛出Illeg

Guava中TreeRangeMap基本使用

RangeMap跟一般的Map一样.存储键值对,依照键来取值.不同于Map的是键的类型必须是Range,也既是一个区间.RangeMap在Guava中的定义是一个接口: public interface RangeMap<K extends Comparable, V> { @Nullable //返回值可能为空的注解 V get(K var1); //依照单点键取键所属区间相应的值 @Nullable //返回值可能为空的注解 Entry<Range<K>, V> g

Guava中TreeRangeMap结构简析

TreeRangeMap之所以能实现按照Range进行排序,这要归功于内部NavigableMap类型的存储变量entriesByLowerBound.NavigableMap是一个接口,继承自SortedMap接口,所以TreeRangeMap具有排序功能.这些接口的使用可以查看此处总结 public final class TreeRangeMap<K extends Comparable, V> implements RangeMap<K, V> { private fina

guava中eventbus注解使用

guava是 google 几个java核心类库的集合,包括集合.缓存.原生类型.并发.常用注解.基本字符串操作和I/O等等.学会使用该库相关api的使用,能使我们代码更简洁,更优雅,本章节我们来谈谈guava中注解的应用: 第一步:定义一个注解类,用来标示订阅: 1 @Beta 2 @Target(ElementType.METHOD) 3 @Retention(RetentionPolicy.RUNTIME) 4 public @interface SubScribe { 5 } 备注: a

guava中String的CharMatcher

1.CharMatcher的field 类型 ANY:匹配任意字符. NONE:任何字符都不匹配 WHITESPACE:匹配字符里面的空格. BREAKING_WHITESPACE:匹配字符之间是否被空格隔断. INVISIBLE:确定字符是否不可见,不可见的字符包括:SPACE_SEPARATOR, LINE_SEPARATOR, PARAGRAPH_SEPARATOR, CONTROL, FORMAT, SURROGATE, 和PRIVATE_USE DIGIT: Determines wh

VB类模块中属性的参数——VBA中Range对象的Value属性和Value2属性的一点区别

在VB中,属性是可以有参数的 -- 即: VB的语法,使用参数的不一定是方法,也有可能是属性!(虽然属性的本质是方法) 例一:参数当作"索引"使用 定义一个类模块,模块名称Ints.为简化模型,使用了只读属性. 1 Private arr(3) As Integer 2 3 Public Property Get ArrValue(Index As Integer) As Integer 4 ArrValue = arr(Index) 5 End Property 6 7 '初始化ar

linux中的strings命令简介

摘自:http://blog.csdn.net/stpeace/article/details/46641069 linux中的strings命令简介 在linux下搞软件开发的朋友, 几乎没有不知道strings命令的.我们先用man strings来看看: strings - print the strings of printable characters in files. 意思是, 打印文件中可打印的字符.  我来补充一下吧, 这个文件可以是文本文件(test.c), 可执行文件(te

linux中的strings命令简介2

摘自:http://blog.csdn.net/stpeace/article/details/46641069 linux中的strings命令简介 之前我们聊过linux strings的用法和用途, 但据我了解, 还有部分朋友并不常用strings, 这是个不好的习惯. 所以, 本文继续啰嗦一下strings命令. 在软件开发中, 我们经常需要修改代码, 并生成静态库.动态库或者可执行文件, 有时候, 工程太大, 那怎样确定自己改动的代码正确编译到库中去了呢? 用strings命令吧!  

C中按位运算符简介

六种常见按位运算符:按位与(&).按位或(|).按位异或(^).按位非(~).按位左移(<<).按位右移(>>). 这些运算符都只能用于整数类型,~是一元运算符,其他都是二元运算符. 1.按位与(&):合并操作数的对应位,如果两个位都是1,结果为1:否则,结果为0.如: x      00001101 y      00000110 x&y  00000100 2.按位或(|):对应位中的两位都是0,则结果为0:否则为1. x      00001101 y