zoukankan      html  css  js  c++  java
  • Range

    在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 valuesall()

      上表中的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




  • 相关阅读:
    SqlServer 查看数据库中所有存储过程
    SqlServer 查看数据库中所有视图
    SqlServer 查询表的详细信息
    SqlServer 遍历修改字段长度
    net core 操作Redis
    Tuning SharePoint Workflow Engine
    Open With Explorer
    Download language packs for SharePoint 2013
    Change Maximum Size For SharePoint List Template when Saving
    Six ways to store settings in SharePoint
  • 原文地址:https://www.cnblogs.com/zhangboyu/p/7448948.html
Copyright © 2011-2022 走看看