背景
我们经常会遇到需求,我有一串数据(有大于等于小于关系),入参的数据定位在某区间段。
像这种需求,一般都是自己判断处理的,自己处理大于等于小于的关系,其实过于麻烦
可以试试guava range
核心方法
closed
[a,b] = { x | a <= x <= b}
open
(a,b) = { x | a < x < b}
openClosed
(a,b] = { x | a < x <= b}
closedOpen
[a,b) = { x | a <= x < b}
测试代码如下所示,经过自测是没有问题
import com.google.common.collect.Range;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
public class SectionUtil {
public static void main(String[] args) {
List<CheckSectionDefine> sectionDefineList = new ArrayList<>(10);
CheckSectionDefine sectionDefine1 = new CheckSectionDefine();
sectionDefine1.setBeginKey(BigDecimal.valueOf(0));
sectionDefine1.setEndKey(BigDecimal.valueOf(5000));
sectionDefine1.setSectionKey("(0,5000]");
sectionDefine1.setSectionValue(new BigDecimal("100"));
CheckSectionDefine sectionDefine2 = new CheckSectionDefine();
sectionDefine2.setBeginKey(BigDecimal.valueOf(5000));
sectionDefine2.setEndKey(BigDecimal.valueOf(1_0000));
sectionDefine2.setSectionKey("(5000,10000)");
sectionDefine2.setSectionValue(new BigDecimal("200"));
CheckSectionDefine sectionDefine3 = new CheckSectionDefine();
sectionDefine3.setBeginKey(BigDecimal.valueOf(1_0000));
sectionDefine3.setEndKey(BigDecimal.valueOf(1000_0000));
sectionDefine3.setSectionKey("[10000,+∞]");
sectionDefine3.setSectionValue(new BigDecimal("300"));
sectionDefineList.add(sectionDefine1);
sectionDefineList.add(sectionDefine2);
sectionDefineList.add(sectionDefine3);
BigDecimal sectionValue = getSectionValue(sectionDefineList, new BigDecimal(10000));
System.out.println("resp = " + sectionValue);
}
public static BigDecimal getSectionValue(List<CheckSectionDefine> sectionDefineList, BigDecimal inputValue) {
for (CheckSectionDefine sectionDefine : sectionDefineList) {
BigDecimal sectionValue = sectionDefine.getSectionValue();
String sectionKey = sectionDefine.getSectionKey();
// false = (, true = [
boolean leftFlag = false;
// false = (, true = [
boolean rightFlag = false;
if (sectionKey.startsWith("[")) {
leftFlag = true;
}
if (sectionKey.endsWith("]")) {
rightFlag = true;
}
BigDecimal beginKey = sectionDefine.getBeginKey();
BigDecimal endKey = sectionDefine.getEndKey();
Range<BigDecimal> range = null;
if (leftFlag && rightFlag) {
// [a,b] = { x | a <= x <= b}
range = Range.closed(beginKey, endKey);
} else if (!leftFlag && !rightFlag) {
// (a,b) = { x | a < x < b}
range = Range.open(beginKey, endKey);
} else if (!leftFlag) {
// (a,b] = { x | a < x <= b}
range = Range.openClosed(beginKey, endKey);
} else {
// [a,b) = { x | a <= x < b}
range = Range.closedOpen(beginKey, endKey);
}
if (range.contains(inputValue)) {
// log.info("[SectionUtil][getSectionValue][inputValue={}][sectionValue={}]", inputValue, JsonUtils.deserializer(sectionValue));
return sectionValue;
}
}
// log.info("[SectionUtil][getSectionValue][没有匹配到数据][inputValue={}][sectionDefineList={}]", inputValue, JsonUtils.deserializer(sectionDefineList));
return BigDecimal.ZERO;
}
@Getter
@Setter
public static class CheckSectionDefine implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 开始值
* 0
* 100
* 200
*/
private BigDecimal beginKey;
/**
* 结束值
* 100
* 200
* 10000000
*/
private BigDecimal endKey;
/**
* (0,100]
* (100,200]
* (200,10000000)
*/
private String sectionKey;
private BigDecimal sectionValue;
}
}