【xue-gao】试试好玩的工具类——guava range数据定位在某区间段

88 阅读1分钟

背景

我们经常会遇到需求,我有一串数据(有大于等于小于关系),入参的数据定位在某区间段。

像这种需求,一般都是自己判断处理的,自己处理大于等于小于的关系,其实过于麻烦

可以试试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;
    }
}