文档章节

Guava区间-Range

Kevin-air
 Kevin-air
发布于 2016/08/05 22:12
字数 1077
阅读 55
收藏 1

在Guava中新增了一个新的类型Range,从名字就可以了解到,这个是和区间有关的数据结构。从Google官方文档可以得到定义:Range定义了连续跨度的范围边界,这个连续跨度是一个可以比较的类型(Comparable type)。比如1到100之间的整型数据。

  在数学里面的范围是有边界和无边界之分的;同样,在Guava中也有这个说法。如果这个范围是有边界的,那么这个范围又可以分为包括开集(不包括端点)和闭集(包括端点);如果是无解的可以用+∞表示。如果枚举的话,一共有九种范围表示:

Guava Range 概念,范围和方法
概念 表示范围 guava对应功能方法
(a..b) {x | a < x < b} open(C, C)
[a..b] {x | a <= x <= b}  closed(C, C)
[a..b) {x | a <= x < b} closedOpen(C, C)
(a..b] {x | a < x <= b} openClosed(C, C)
(a..+∞) {x | x > a} greaterThan(C)
[a..+∞) {x | x >= a} atLeast(C)
(-∞..b) {x | x < b} lessThan(C)
(-∞..b] {x | x <= b} atMost(C)
(-∞..+∞) all values all()

  上表中的guava对应功能方法那一栏表示Range类提供的方法,分别来表示九种可能出现的范围区间。如果区间两边都存在范围,在这种情况下,区间右边的数不可能比区间左边的数小。在极端情况下,区间两边的数是相等的,但前提条件是最少有一个边界是闭集的,否则是不成立的。比如:
  [a..a] : 里面只有一个数a;
  [a..a); (a..a] : 空的区间范围,但是是有效的;
  (a..a) : 这种情况是无效的,构造这样的Range将会抛出异常。
  在使用Range时需要注意:在构造区间时,尽量使用不可改变的类型。如果你需要使用可变的类型,在区间类型构造完成的情况下,请不要改变区间两边的数。

示例

import com.google.common.collect.BoundType;
import com.google.common.collect.Range;
import com.google.common.primitives.Ints;
import org.junit.Test;

/**
 * Created by g on 2016/8/5.
 */
public class RangeTest {

    @Test
    public void rangeTest() {
        // open:(1‥10)
        System.out.println("open:" + Range.open(1, 10));
        // closed:[1‥10]
        System.out.println("closed:" + Range.closed(1, 10));
        // closedOpen:[1‥10)
        System.out.println("closedOpen:" + Range.closedOpen(1, 10));
        // openClosed:(1‥10]
        System.out.println("openClosed:" + Range.openClosed(1, 10));
        // greaterThan:(10‥+∞)
        System.out.println("greaterThan:" + Range.greaterThan(10));
        // atLeast:[10‥+∞)
        System.out.println("atLeast:" + Range.atLeast(10));
        // lessThan:(-∞‥10)
        System.out.println("lessThan:" + Range.lessThan(10));
        // atMost:(-∞‥10]
        System.out.println("atMost:" + Range.atMost(10));
        // all:(-∞‥+∞)
        System.out.println("all:" + Range.all());
        // closed:[10‥10]
        System.out.println("closed:" + Range.closed(10, 10));
        // closedOpen:[10‥10)
        System.out.println("closedOpen:" + Range.closedOpen(10, 10));
        // 会抛出异常
//        System.out.println("open:" + Range.open(10, 10));

        // downTo:(4‥+∞)
        System.out.println("downTo:" + Range.downTo(4, BoundType.OPEN));
        // upTo:(-∞‥4]
        System.out.println("upTo:" + Range.upTo(4, BoundType.CLOSED));
        // range:[1‥4)
        System.out.println("range:" + Range.range(1, BoundType.CLOSED, 4, BoundType.OPEN));
    }

    @Test
    public void containsTest() {
        // contains:判断值是否在当前Range内
        // true
        System.out.println(Range.closed(1, 3).contains(2));
        // false
        System.out.println(Range.closed(1, 3).contains(4));
        // false
        System.out.println(Range.lessThan(5).contains(5));
        // true
        System.out.println(Range.closed(1, 4).containsAll(Ints.asList(1, 2, 3)));
    }

    @Test
    public void queryTest() {
        // Endpoint相关查询方法
        // true
        System.out.println("hasLowerBound:" + Range.closedOpen(4, 4).hasLowerBound());
        // true
        System.out.println("hasUpperBound:" + Range.closedOpen(4, 4).hasUpperBound());
        // true
        System.out.println(Range.closedOpen(4, 4).isEmpty());
        // true
        System.out.println(Range.openClosed(4, 4).isEmpty());
        // false
        System.out.println(Range.closed(4, 4).isEmpty());
        // 3
        System.out.println(Range.closed(3, 10).lowerEndpoint());
        // 3
        System.out.println(Range.open(3, 10).lowerEndpoint());
        // 10
        System.out.println(Range.closed(3, 10).upperEndpoint());
        // 10
        System.out.println(Range.open(3, 10).upperEndpoint());
        // CLOSED
        System.out.println(Range.closed(3, 10).lowerBoundType());
        // OPEN
        System.out.println(Range.open(3, 10).upperBoundType());
    }

    @Test
    public void enclosesTest() {
        Range<Integer> rangeBase = Range.open(1, 4);
        Range<Integer> rangeClose = Range.closed(2, 3);
        Range<Integer> rangeCloseOpen = Range.closedOpen(2, 4);
        Range<Integer> rangeCloseOther = Range.closedOpen(2, 5);
        // encloses(Range range)中的range是否包含在需要比较的range中
        // rangeBase: (1‥4) Enclose:true rangeClose:[2‥3]
        System.out.println("rangeBase: " + rangeBase + " Enclose:" + rangeBase.encloses(rangeClose) + " rangeClose:" + rangeClose);
        // rangeBase: (1‥4) Enclose:true rangeClose:[2‥4)
        System.out.println("rangeBase: " + rangeBase + " Enclose:" + rangeBase.encloses(rangeCloseOpen) + " rangeCloseOpen:" + rangeCloseOpen);
        // rangeBase: (1‥4) Enclose:false rangeClose:[2‥5)
        System.out.println("rangeBase: " + rangeBase + " Enclose:" + rangeBase.encloses(rangeCloseOther) + " rangeCloseOther:" + rangeCloseOther);
    }

    @Test
    public void isConnectedTest() {
        // isConnected range是否可以连接上
        // true
        System.out.println(Range.closed(3, 5).isConnected(Range.open(5, 10)));
        // true
        System.out.println(Range.closed(0, 9).isConnected(Range.closed(3, 4)));
        // true
        System.out.println(Range.closed(0, 5).isConnected(Range.closed(3, 9)));
        // false
        System.out.println(Range.open(3, 5).isConnected(Range.open(5, 10)));
        // false
        System.out.println(Range.closed(1, 5).isConnected(Range.closed(6, 10)));
    }

    @Test
    public void intersectionTest() {
        // intersection:如果两个range相连时,返回最大交集,如果不相连时,直接抛出异常
        // (5‥5]
        System.out.println(Range.closed(3, 5).intersection(Range.open(5, 10)));
        // [3‥4]
        System.out.println(Range.closed(0, 9).intersection(Range.closed(3, 4)));
        // [3‥5]
        System.out.println(Range.closed(0, 5).intersection(Range.closed(3, 9)));

        // 抛出异常
        System.out.println(Range.open(3, 5).intersection(Range.open(5, 10)));
        System.out.println(Range.closed(1, 5).intersection(Range.closed(6, 10)));
    }

    @Test
    public void spanTest() {
        // span:获取两个range的并集,如果两个range是两连的,则是其最小range
        // [3‥10)
        System.out.println(Range.closed(3, 5).span(Range.open(5, 10)));
        // [0‥9]
        System.out.println(Range.closed(0, 9).span(Range.closed(3, 4)));
        // [0‥9]
        System.out.println(Range.closed(0, 5).span(Range.closed(3, 9)));
        // (3‥10)
        System.out.println(Range.open(3, 5).span(Range.open(5, 10)));
        // [1‥10]
        System.out.println(Range.closed(1, 5).span(Range.closed(6, 10)));
        // [1‥10]
        System.out.println(Range.closed(1, 5).span(Range.closed(7, 10)));
    }
}

 

© 著作权归作者所有

共有 人打赏支持
Kevin-air
粉丝 14
博文 73
码字总数 26587
作品 0
深圳
私信 提问
Guava学习笔记:Range

  在Guava中新增了一个新的类型Range,从名字就可以了解到,这个是和区间有关的数据结构。从Google官方文档可以得到定 义:Range定义了连续跨度的范围边界,这个连续跨度是一个可以比较的类...

pior
2015/03/31
0
0
大于小于写的累不?

背景 某天有需求如下: db执行在凌晨某个时间段会进行备份 需要对db库停止写操作 那么我们肯定会想到利用类似aop等手段在写操作时拒绝执行抛出指定异常即可。这个实现暂且不提 我们先想一下如...

Mr_Qi
2018/01/24
0
0
Guava一些高效类的使用实践

guava是google的一个强大的工具包,目前已经更新到版本22 https://github.com/google/guava,一直有断断续续的用过一些方法,但是没有系统的撸一遍所有功能 今天参考并发编程网记录一些高效的...

zimingforever
2017/06/15
0
0
GUAVA常用方法总结整理(list map string concurrent file)

1.对字符串的操作: 2.FluentIterable迭代器: Guava提供了可以在Iterator中进行处理的功能更丰富的迭代器, 其实就像是加了一个代理, 增加一些功能。 3.Lists列表: Table矩阵: 使用Guava...

李矮矮
2016/09/17
106
0
Google Guava 中文指南

温馨提示:Guava 中文指南的 GitHub 地址为 guava-guide,欢迎大家、,纠错。 Guava 中文指南   Guava 项目包含若干被 Google 的 Java 项目依赖的核心类库,例如:集合、缓存、原生类型支持...

qq_35246620
2017/09/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

《货币商人》读后感作文选登3800字

《货币商人》读后感作文选登3800字: 领导之法、管理之术的大智慧与小技巧(宝安支行纪委书记葛希) 非常感谢夏书记向我们推荐了这本《货币商人》。这本书我读第一遍时惊现它像一个宝藏,蕴藏...

原创小博客
4分钟前
0
0
面试之ssm粗略简答

说实在的,spring源码对我来说可能就是报错的时候会一个个点进去找错误源头,其他都是为了让自己学习大神们优秀的编程思想和理念(顺便面试的时候吹吹牛皮~) 这次zhjj就直接抛了一个范围很...

无极之岚
5分钟前
0
0
史上最强Dubbo面试25题含答案详解:核心组件+架构设计+服务治理等

1.Dubbo是什么? Dubbo 是一个分布式、高性能、透明化的 RPC 服务框架,提供服务自动注册、自动发现等高效服务治理方案, 可以和 Spring 框架无缝集成。 RPC 指的是远程调用协议,也就是说两...

mikechen优知
29分钟前
0
0
如何正确的选择云数据库?

本文由云+社区发表 作者:数据库 江湖传说在选择和使用云数据库过程中 10个人有9个会遇到以下问题: 数据库正常使用过程中莫名卡顿 经常遭遇主从延迟和主从不一致 不知如何实现无损跨云跨数据...

腾讯云加社区
29分钟前
0
0
虚拟机下centos7.x简易命令大全与试玩体验

OS: liunx version: centos7.x date: 2019-01-18 1. cd / : 进入服务器根目录 2. cd .. : 进入当前目录的上一级 3. ls : 显示当前目录下的所有文件夹或文件(list的缩写) 4. ip addr : 展示服...

皇冠小丑
40分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部