原文链接:http://www.cnblogs.com/peida/p/Guava_Range.html  

在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时需要注意:在构造区间时,尽量使用不可改变的类型。如果你需要使用可变的类型,在区间类型构造完成的情况下,请不要改变区间两边的数。

  实例:

public class TestBaseRange {
@Test
public void testRange(){
System.out.println("open:"+Range.open(1, 10));
System.out.println("closed:"+ Range.closed(1, 10));
System.out.println("closedOpen:"+ Range.closedOpen(1, 10));
System.out.println("openClosed:"+ Range.openClosed(1, 10));
System.out.println("greaterThan:"+ Range.greaterThan(10));
System.out.println("atLeast:"+ Range.atLeast(10));
System.out.println("lessThan:"+ Range.lessThan(10));
System.out.println("atMost:"+ Range.atMost(10));
System.out.println("all:"+ Range.all());
System.out.println("closed:"+Range.closed(10, 10));
System.out.println("closedOpen:"+Range.closedOpen(10, 10));
//会抛出异常
System.out.println("open:"+Range.open(10, 10));
}
}

  此外,范围可以构造实例通过绑定类型显式,例如:

public class TestBaseRange {

    @Test
public void testRange(){
System.out.println("downTo:"+Range.downTo(4, BoundType.OPEN));
System.out.println("upTo:"+Range.upTo(4, BoundType.CLOSED));
System.out.println("range:"+Range.range(1, BoundType.CLOSED, 4, BoundType.OPEN));
}
}

  输出:

downTo:(4‥+∞)
upTo:(-∞‥4]
range:[1‥4)

  操作方法

  1.contains:判断值是否在当前Range内

    @Test
public void testContains(){
System.out.println(Range.closed(1, 3).contains(2));
System.out.println(Range.closed(1, 3).contains(4));
System.out.println(Range.lessThan(5).contains(5));
System.out.println(Range.closed(1, 4).containsAll(Ints.asList(1, 2, 3)));
}   //=====输出=====
  true
  false
  false
  true

  2.Endpoint相关查询方法:

    @Test
public void testQuery(){
System.out.println("hasLowerBound:"+Range.closedOpen(4, 4).hasLowerBound());
System.out.println("hasUpperBound:"+Range.closedOpen(4, 4).hasUpperBound());
System.out.println(Range.closedOpen(4, 4).isEmpty());
System.out.println(Range.openClosed(4, 4).isEmpty());
System.out.println(Range.closed(4, 4).isEmpty());
// Range.open throws IllegalArgumentException
//System.out.println(Range.open(4, 4).isEmpty()); System.out.println(Range.closed(3, 10).lowerEndpoint());
System.out.println(Range.open(3, 10).lowerEndpoint());
System.out.println(Range.closed(3, 10).upperEndpoint());
System.out.println(Range.open(3, 10).upperEndpoint());
System.out.println(Range.closed(3, 10).lowerBoundType());
System.out.println(Range.open(3, 10).upperBoundType());
}   //======输出=======
  hasLowerBound:true
  hasUpperBound:true
  true
  true
  false
  3
  3
  10
  10
  CLOSED
  OPEN

  3.encloses方法:encloses(Range range)中的range是否包含在需要比较的range中

    @Test
public void testEncloses(){
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);
System.out.println("rangeBase: "+rangeBase+" Enclose:"+rangeBase.encloses(rangeClose)+" rangeClose:"+rangeClose);
System.out.println("rangeBase: "+rangeBase+" Enclose:"+rangeBase.encloses(rangeCloseOpen)+" rangeClose:"+rangeCloseOpen);
System.out.println("rangeBase: "+rangeBase+" Enclose:"+rangeBase.encloses(rangeCloseOther)+" rangeClose:"+rangeCloseOther);
}   //=======输出========
  rangeBase: (1‥4) Enclose:true rangeClose:[2‥3]
  rangeBase: (1‥4) Enclose:true rangeClose:[2‥4)
  rangeBase: (1‥4) Enclose:false rangeClose:[2‥5)

  4.isConnected:range是否可连接上

    @Test
public void testConnected(){
System.out.println(Range.closed(3, 5).isConnected(Range.open(5, 10)));
System.out.println(Range.closed(0, 9).isConnected(Range.closed(3, 4)));
System.out.println(Range.closed(0, 5).isConnected(Range.closed(3, 9)));
System.out.println(Range.open(3, 5).isConnected(Range.open(5, 10)));
System.out.println(Range.closed(1, 5).isConnected(Range.closed(6, 10)));
}   //======输出=========
  true
  true
  true
  false
  false

  4.intersection:如果两个range相连时,返回最大交集,如果不相连时,直接抛出异常

    @Test
public void testIntersection(){
System.out.println(Range.closed(3, 5).intersection(Range.open(5, 10)));
System.out.println(Range.closed(0, 9).intersection(Range.closed(3, 4)));
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)));
}   //=======输出=========
  (5‥5]
  [3‥4]
  [3‥5]   注意:第四和第五行代码,当集合不相连时,会直接报错

  5.span:获取两个range的并集,如果两个range是两连的,则是其最小range

    @Test
public void testSpan(){
System.out.println(Range.closed(3, 5).span(Range.open(5, 10)));
System.out.println(Range.closed(0, 9).span(Range.closed(3, 4)));
System.out.println(Range.closed(0, 5).span(Range.closed(3, 9)));
System.out.println(Range.open(3, 5).span(Range.open(5, 10)));
System.out.println(Range.closed(1, 5).span(Range.closed(6, 10)));
System.out.println(Range.closed(1, 5).span(Range.closed(7, 10)));
}   //=====输出=======
  true
  true
  true
  false
  false

Range(转)的更多相关文章

  1. SQL Server 合并复制遇到identity range check报错的解决

        最近帮一个客户搭建跨洋的合并复制,由于数据库非常大,跨洋网络条件不稳定,因此只能通过备份初始化,在初始化完成后向海外订阅端插入数据时发现报出如下错误: Msg 548, Level 16, S ...

  2. Java 位运算2-LeetCode 201 Bitwise AND of Numbers Range

    在Java位运算总结-leetcode题目博文中总结了Java提供的按位运算操作符,今天又碰到LeetCode中一道按位操作的题目 Given a range [m, n] where 0 <= ...

  3. [LeetCode] Range Addition 范围相加

    Assume you have an array of length n initialized with all 0's and are given k update operations. Eac ...

  4. [LeetCode] Count of Range Sum 区间和计数

    Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.Ra ...

  5. [LeetCode] Range Sum Query 2D - Mutable 二维区域和检索 - 可变

    Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper lef ...

  6. [LeetCode] Range Sum Query - Mutable 区域和检索 - 可变

    Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...

  7. [LeetCode] Range Sum Query 2D - Immutable 二维区域和检索 - 不可变

    Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper lef ...

  8. [LeetCode] Range Sum Query - Immutable 区域和检索 - 不可变

    Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...

  9. [LeetCode] Bitwise AND of Numbers Range 数字范围位相与

    Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers ...

  10. C++11中自定义range

    python中的range功能非常好用 for i in range(100): print(i) 现在利用C++11的基于范围的for循环特性实现C++中的range功能 class range { ...

随机推荐

  1. css3之calc()

    初识calc() 在使用calc()之前,我也只是听说有这么一个东西,但在用过之后我才发现这个功能其实很实用. calc()其实就是英文calculate(计算)的缩写,它看起来像个函数吧? 其实不是 ...

  2. log4cpp第一个程序HelloWord

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  3. django 自定义用户表替换系统默认表

    首先新建一个users应用,编写这个应用的models类. from django.contrib.auth.models import AbstractUser class UserProfile( ...

  4. python之阶乘的小例子

    现在自己写阶乘是这个样子的 def f(x): return x * f(x-1) if x >1 else 1 后来无意中看到耗子的一篇<Python程序员的进化>的文章, 感脚这 ...

  5. C++面向对象高级编程(六)转换函数与non-explicit one argument ctor

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.conversion function 转换函数 //1.转换函数 //conversion function //只要你认为合理 你可以任 ...

  6. SpringMVC札集(05)——SpringMVC参数回显

    自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onL ...

  7. ansible资料

    ansible系列教程-强烈推荐看完 ansible官方编写的例子 ansible_ui Jenkins配置ansible galaxy 官方文档 中文教程1 中文教程2 playbook进阶 YAM ...

  8. Return type declarations返回类型声明

    PHP 7.新增了返回类型声明 http://php.net/manual/en/functions.returning-values.php 在PHP 7.1中新增了返回类型声明为void,以及类型 ...

  9. 解决在django中应用keras模型时出现的ValueError("Tensor %s is not an element of this graph." % obj)问题

    用keras训练好模型,再在django初始化加载模型,这个过程没有问题,但是在调用到模型执行model.predict()的时候就报错: raise ValueError("Tensor ...

  10. iOS怎么来实现关闭自动锁屏

    怎么来设置[UIApplication sharedApplication]   idleTimerDisabled 属性来控制自动锁屏的效果 // 把设置idleTimerDisabled的代码放到 ...