Guava:Range 区间范围工具

简介

Range 表示一个间隔或一个序列。它被用于获取一组数字/串在一个特定范围之内。可比较类型的区间API,包括连续和离散类型。

Range 定义了连续跨度的范围边界,这个连续跨度是一个可以比较的类型(Comparable type)。比如1到100之间的整型数据。

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

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

上面的 ab 称为 端点;a 为 下端点,b 为 上端点。

Guava 中的 Range 要求:

  • 上端点不能小于下端点。

  • 极端情况下,上下端点有可能是相等的,但要求区间是闭区间或半开半闭区间(至少有一个端点是包含在区间中的)

如下示例:

  • [a..a]:单元素区间

  • [a..a)(a..a]:空区间,但它们是有效的

  • (a..a):无效区间,构造这样的 Range 将会抛出异常

Guava 用类型 Range<C> 表示区间。所有区间实现都是不可变类型。

类方法说明

方法名称方法描述
all() 返回包含类型C所有值的Range
apply(C input) 已过时。 仅提供满足Predicate接口
atLeast(C endpoint) 返回大于等于endpoint的所有值Range
atMost(C endpoint) 返回小于等于endpoint的所有值Range
canonical(DiscreteDomain<C> domain) 返回在给定domain离散域下Range的规范形式
closed(C lower, C upper) 返回一个Range,包含大于等于lower小于等于upper范围的所有值,数学表示 [lower,upper]
closedOpen(C lower, C upper) 返回一个Range,包含大于等于lower严格小于upper范围的所有值,数学表示 [lower,upper).
contains(C value) 判断Range中是否包含指定的value
containsAll(Iterable<? extends C> values) 判断指定values中是否所有值都包含在Range中
downTo(C endpoint, BoundType boundType) 
返回下限临界值为endpoint的区间,下限开闭性由boundType指定
encloseAll(Iterable<C> values) 返回Range与传入values比较后的最小范围区间
encloses(Range<C> other) 返回传入Range是否包含在调用此方法的Range中
equals(@Nullable Object object) 
如果object是具有与此范围相同的端点和绑定类型的范围,则返回true
gap(Range<C> otherRange) 
返回两个Range之间的最大范围
greaterThan(C endpoint) 
返回严格大于endpoint的所有值Range
hashCode() 返回此范围的哈希码。
hasLowerBound() 返回Range是否存在下限
hasUpperBound() 返回Range是否存在上限
intersection(Range<C> connectedRange) 返回两个Range的最大交集,如果Range无交集,抛出异常IllegalArgumentException.
booleanisConnected(Range<C> other) 
返回两个Range是否能够连续上.
isEmpty() 判断Range是否为空,即上下限是否相等,例如 [v..v) or (v..v].
lessThan(C endpoint) 
返回严格小于endpoint的所有值Range
lowerBoundType() 返回Range的下限类型BoundType,即开闭性
lowerEndpoint() 返回Range下限的临界点值
open(C lower, C upper) 返回一个Range,包含严格大于lower小于upper范围的所有值,数学表示(lower,upper)
openClosed(C lower, C upper) 返回一个Range,包含严格大于lower小于等于upper范围的所有值,数学表示 (lower,upper]
range(C lower, BoundType lowerType, C upper, BoundType upperType) 返回一个Range,包含lower和upper范围的所有值,临界值的开闭可以通过BoundType设置,BoundType 是枚举类型,标识开闭.
ssingleton(C value)返回唯一包含传入value的Range
span(Range<C> other) 返回两个Range的并集
toString() 返回此范围的字符串表示形式,例如 "[3..5)"
upperBoundType() 返回Range的上限类型BoundType,即开闭性
upperEndpoint() 返回Range上限的临界点值
upTo(C endpoint, BoundType boundType) 
返回上限临界值为endpoint的区间,上限开闭性由boundType指定

使用Demo

import com.google.common.collect.*;
import com.google.common.primitives.Ints;
import junit.framework.TestCase;
import java.math.BigDecimal;
import java.util.Set;public class RangeTest extends TestCase {/*** 1、构建区间*/public void test1(){//无上界区间Range<Integer> downTo = Range.downTo(3, BoundType.OPEN);// (3..+∞)//无下界区间Range<Integer> upTo = Range.upTo(3, BoundType.CLOSED);// (-∞..3]//有界区间Range<Integer> range = Range.range(1, BoundType.CLOSED, 6, BoundType.OPEN);// [1..6) 等同于 Range.closedOpen(1, 6)}/*** 区间测算*/public void test2(){BigDecimal bigDecimal = BigDecimal.valueOf(1.2);Range<Integer> closed = Range.closed(1, 3);System.out.println(closed.contains(1));// return trueSystem.out.println(closed.contains(3));     // return falseSystem.out.println(Range.lessThan(5).contains(5));      // return falseSystem.out.println(Range.greaterThan(4).contains(5));//trueRange<Integer> closed2 = Range.closed(1, 4);System.out.println(closed2.containsAll(Ints.asList(1, 2, 3)));   // return trueSystem.out.println(closed2.containsAll(Ints.asList(1, 2, 5))); //false}/*** 区间工具判断*/public void test3(){//判断区间是否有特定边界,或是无限的Range<Integer> closedOpen = Range.closedOpen(3, 3);closedOpen.hasLowerBound(); // return trueclosedOpen.hasUpperBound(); // return true//判断是否为空区间。boolean empty = Range.closedOpen(4, 4).isEmpty();// return trueboolean empty1 = Range.openClosed(4, 4).isEmpty();// return trueboolean empty2 = Range.closed(4, 4).isEmpty();// return false//Range.open(4, 4).isEmpty();             // Range.open throws IllegalArgumentException//返回区间的端点值;如果区间没有对应的边界,抛出 IllegalStateException。Integer lowerEndpoint = Range.closed(3, 10).lowerEndpoint();// return 3Integer lowerEndpoint1 = Range.open(3, 10).lowerEndpoint();// return 3BoundType lowerBoundType = Range.closed(3, 10).lowerBoundType();// return CLOSEDBoundType upperBoundType = Range.open(3, 10).upperBoundType();// return OPEN}/*** 区间工具与区间工具的关系判断*/public void test4(){//(1)包含 [encloses]boolean encloses = Range.closed(3, 5).encloses(Range.open(5, 10));// return falseboolean encloses1 = Range.closed(0, 9).encloses(Range.closed(3, 4));// return trueboolean encloses2 = Range.open(3, 5).encloses(Range.open(5, 10));// return false//(2)相连 [isConnected]这等同于数学上的定义”两个区间的并集是连续集合的形式”(空区间的特殊情况除外)。boolean connected = Range.closed(3, 5).isConnected(Range.open(5, 10));// return trueboolean connected1 = Range.closed(0, 9).isConnected(Range.closed(3, 4));// return trueboolean connected2 = Range.closed(0, 5).isConnected(Range.closed(3, 9));// return trueboolean connected3 = Range.open(3, 5).isConnected(Range.open(5, 10));// return falseboolean connected4 = Range.closed(1, 5).isConnected(Range.closed(6, 10));// return false//(3)交集 [intersection]Range<Integer> intersection = Range.closed(3, 5).intersection(Range.open(5, 10));// return (5, 5]Range<Integer> intersection1 = Range.closed(0, 9).intersection(Range.closed(3, 4));// return [3, 4]Range<Integer> intersection2 = Range.closed(0, 5).intersection(Range.closed(3, 9));// return [3, 5]//Range<Integer> intersection3 = Range.open(3, 5).intersection(Range.open(5, 10));// java.lang.IllegalArgumentException: Invalid range: (5..5)//Range<Integer> intersection4 = Range.closed(1, 5).intersection(Range.closed(6, 10));// java.lang.IllegalArgumentException: Invalid range: [6..5]//(4)跨区间 [span]Range<Integer> span = Range.closed(3, 5).span(Range.open(5, 10));// return [3, 10)Range<Integer> span1 = Range.closed(0, 9).span(Range.closed(3, 4));// return [0, 9]Range<Integer> span2 = Range.closed(0, 5).span(Range.closed(3, 9));// return [0, 9]Range<Integer> span3 = Range.open(3, 5).span(Range.open(5, 10));// return (3, 10)Range<Integer> span4 = Range.closed(1, 5).span(Range.closed(6, 10));// return [1, 10]}public void test6() {Range<Integer> range = Range.closed(20, 30);print("closed", ContiguousSet.create(range, DiscreteDomain.integers()));range = Range.open(20, 30);print("open", ContiguousSet.create(range, DiscreteDomain.integers()));range = Range.openClosed(20, 30);print("openClosed", ContiguousSet.create(range, DiscreteDomain.integers()));range = Range.closedOpen(20, 30);print("closedOpen", ContiguousSet.create(range, DiscreteDomain.integers()));range = Range.greaterThan(20);System.out.println("greaterThan: " + ContiguousSet.create(range, DiscreteDomain.integers()).toString());range = Range.atLeast(20);System.out.println("atLeast: " + ContiguousSet.create(range, DiscreteDomain.integers()).toString());range = Range.lessThan(30);System.out.println("lessThan: " + ContiguousSet.create(range, DiscreteDomain.integers()).toString());range = Range.atMost(30);System.out.println("atMost: " + ContiguousSet.create(range, DiscreteDomain.integers()).toString());range = Range.all();System.out.println("all: " + ContiguousSet.create(range, DiscreteDomain.integers()).toString());}public static void print(String type, Set<Integer> ranges) {System.out.println(type + ":" + ranges + "      list:" + Lists.newArrayList(ranges));}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/610175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安全防御之备份恢复技术

随着计算机和网络的不断普及&#xff0c;人们更多的通过网络来传递大量信息。在网络环境下&#xff0c;还有各种各样的病毒感染、系统故障、线路故障等&#xff0c;使得数据信息的安全无法得到保障。由于安全风险的动态性&#xff0c;安全不是绝对的&#xff0c;信息系统不可能…

【Unity】UniTask(异步工具)快速上手

UniTask(异步工具) 官方文档&#xff1a;https://github.com/Cysharp/UniTask/blob/master/README_CN.md URL:https://github.com/Cysharp/UniTask.git?pathsrc/UniTask/Assets/Plugins/UniTask 优点&#xff1a;0GC&#xff0c;可以在任何地方使用 为Unity提供一个高性能&…

(Matlab)基于CNN-GRU的多输入分类(卷积神经网络-门控循环单元网络)

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、部分程序&#xff1a; 四、完整代码数据分享&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译…

雍禾医疗启动“毛发森林”公益计划 为地球种植“发际线”

不久前&#xff0c;由雍禾植发、新华网及中国绿化基金会三方共同发起的 “毛发森林地球生发计划”在内蒙古自治区阿拉善盟额济纳旗揭牌启动,此计划将陆续在西部严重沙化地区植下十万棵梭梭树改善荒漠化地区环境。 据悉,早在2023年3月,雍禾植发就主动与新华网一起启动“让美好生…

Rabbitmq 消息可靠性保证

1、简介 消息的可靠性投递就是要保证消息投递过程中每一个环节都要成功&#xff0c;本文详细介绍两个环节的消息可靠性传递方式&#xff1a;1&#xff09;、消息传递到交换机的 confirm 模式&#xff1b;2&#xff09;、消息传递到队列的 Return 模式。 消息从 producer 到 ex…

Msa全球最新研究:多系统萎缩特效药全球最新进展?

多系统萎缩&#xff0c;是一种以神经系统为主的遗传性疾病&#xff0c;典型症状表现为运动障碍、自主神经功能障碍和认知障碍等。对于这种疾病&#xff0c;西医目前尚未有明确的根治办法&#xff0c;大多数医生只能通过药物缓解患者的症状&#xff0c;但无法彻底治愈。 然而&a…

轮排索引相关知识

轮排索引&#xff08;Round Robin Index&#xff09;是一种数据结构&#xff0c;通常用于分布式系统中的索引管理。 基本思想是将索引分为多个块&#xff0c;并循环地轮流在这些块中存储键值对&#xff0c;以实现负载均衡。这样可以防止某个特定块的负载过重&#xff0c;使得系…

C#的list进行升序或者降序的排列方式(亲测有效)

C#的list进行升序或者降序的排列方式&#xff08;亲测有效&#xff09; 1.list升序排序&#xff1a;时间从小到大排列 s在前就是升序 listNew.Sort((s, x) > s.CreateTime.CompareTo(x.CreateTime));2.list降序排序&#xff1a;时间从大到小排列 x在前就是降序 listNew.So…

第9章 正则表达式

学习目标 熟悉正则表达式,能够说出正则表达式的概念和作用 掌握正则表达式的创建,能够使用两种方式创建正则表达式 掌握正则表达式的使用,能够使用正则表达式进行字符串匹配 掌握正则表达式中元字符的使用,能够根据需求选择合适的元字符 掌握正则表达式中模式修饰符的使用,…

CDN加速之HTTPS配置

记录一下HTTPS配置的免费证书配置 2张图搞定 最后补充说明&#xff1a; 由于CDN采用的Tengine服务基于Nginx&#xff0c;因此开启HTTPS安全加速功能的加速域名&#xff0c;只支持上传Nginx能读取的PEM格式的证书。如果证书不是PEM格式&#xff0c;需转换成PEM格式。转换方法&a…

C#,字符串匹配(模式搜索)KMP算法的源代码与数据可视化

D.E.Knuth J.H.Morris 一、KMP算法 KMP 算法&#xff08;Knuth-Morris-Pratt 算法&#xff09;是其中一个著名的、传统的字符串匹配算法&#xff0c;效率比较高。 KMP算法由D.E.Knuth&#xff0c;J.H.Morris和V.R.Pratt在 Brute-Force算法的基础上提出的模式匹配的改进算法。…

江山易改本性难移之ZYNQ SDK QSPI固化bug及其解决方法

之前在Vivado2018.3通过QSPI方式固化程序时出现问题&#xff0c;显示flash擦除成功&#xff0c;但最后总是不能写入到flash中。 查资料发现从VIVADO 2017.3版本开始&#xff0c;Xilinx官方为了使Zynq-7000和Zynq UltraScale 实现流程相同&#xff0c;在QSPI FLASH使用上做了变化…

基于JAVA+SpringBoot的高校学术报告系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 智慧高校学术报告系统…

【SpringCloud】之入门级及nacos的集成使用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《SpringCloud开发之入门级及nacos》。&#x1f3…

【Github3k+⭐️】《CogAgent: A Visual Language Model for GUI Agents》译读笔记

CogAgent: A Visual Language Model for GUI Agents 摘要 人们通过图形用户界面&#xff08;Graphical User Interfaces, GUIs&#xff09;在数字设备上花费大量时间&#xff0c;例如&#xff0c;计算机或智能手机屏幕。ChatGPT 等大型语言模型&#xff08;Large Language Mo…

免费用chatGPT

免费用chatGPT&#xff0c;地址&#xff1a; DocGPT - 第二大脑

设计模式面试

C 面向对象设计 封装&#xff1a;隐藏内部实现继承&#xff1a;复用现有代码多态&#xff1a;改写对象行为 设计模式关键在于分解和抽象; 设计模式的主要目的是易于变化 面向对象设计原则–比设计模式更加重要 违背了设计原则&#xff0c;设计模式是错误的。 依赖倒置原则…

你们做外贸主要的获客渠道有哪些?

昨天跟一个同行朋友聊天&#xff0c;他原本主打产品是做动力类的&#xff0c;这两年竞争太大&#xff0c;订单也减少了很多。为了求发展&#xff0c;就拓品了&#xff0c;而拓展的新品刚好是我们这一块&#xff0c;而且非常迅速地找到场地把生产线弄了起来&#xff0c;还不断扩…

严格次小生成树(LCA+Kruskal)

一、次小生成树 次小生成树是指在给定的无向图中&#xff0c;如果存在最小生成树和次小生成树&#xff0c;那么对于任何一颗最小生成树来看&#xff0c;都存在一颗次小生成树&#xff0c;使得这两棵树只有一条边不同。次小生成树的边权和大于等于最小生成树的另一颗树&#xf…

RT-DETR 更换骨干网络之 MobileNetV3 | 《搜寻 MobileNetV3》

论文地址:https://arxiv.org/abs/1905.02244 代码地址:https://github.com/xiaolai-sqlai/mobilenetv3 我们展示了基于互补搜索技术和新颖架构设计相结合的下一代 MobileNets。MobileNetV3通过结合硬件感知网络架构搜索(NAS)和 NetAdapt算法对移动设计如何协同工作,利用互…