校验区间范围是否重复

这篇博客探讨了如何优化区间重复数据的校验方法,针对大区间数据,避免了传统遍历带来的效率问题。通过将区间拆分并存入Map,然后遍历Map进行区间比较,显著提升了处理效率,减少了时间和空间消耗。这种方法对于处理大规模区间数据尤为适用。

判断区间是否重复重叠

例如:
第一组区间:1-10 包含 1、2、3、4……10等
第二组区间:8-15 包含 8、9、10、11……15等
第三组区间:16-20 包含 16、17、18、19、20

从上面两几组数据来看 第一组区间与第二组区间 含重复数据

重复数字 如:8、9、10

那么我们需要怎么做才能校验它们中间包含的重复数字呢?
一般遇到这种情况有的同学可能想都不用想直接上手:

 

List<Integer> integers = new ArrayList<>();
List<String> strs = new ArrayList<>();
strs.add("1-10");
strs.add("8-15");
strs.add("16-20");

for (int i = 0; i < strs.size(); i++) {
    String[] str = strs.get(i).split("-");
    int start = Integer.parseInt(str[0]);
    int end = Integer.parseInt(str[1]);
    for (int k = start; k <= end; k++) {
        if (!integers.contains(k)) {
            integers.add(k);
        }else{
           System.out.print("重复数据:" + k);
        }
    }
}

成功输出区间重复数字 8、9、10
 

以上做法虽然将正确答案输出了,但并不可取,因为如果 区间变大了呢?

 例如:
第一组区间:10000000000001-10000000000010
第二组区间:10000000000008-10000000000015
第一组区间:10000000000016-10000000000020

 看到这么大的区间如果还要用上面得做法,你是否感到了绝望呢?

不开子线程大概是以卡死告终!

即便开了子线程也需要耗费大量的时间与空间,由此我们需要优化!且看第二种处理方式。

 优化思路:

由于第一种方式虽然结果是对的,但是却无法满足大区间的要求,因此我不能将数据遍历出来判断是否包含,由此我们是否可以想象将区间拆分后放入Map集合中呢?然后遍历进行比大小?这样效率不就提升了一个档次?说干就干!

List<String> strs = new ArrayList<>();
strs.add("10000000000001-10000000000010");
strs.add("10000000000008-10000000000015");
strs.add("10000000000011-10000000000020");
Map<Long, Long> checkMaps = new HashMap<>();
/*遍历区间集合并拆分放入Map集合中 key-value */
for (int i = 0; i < strs.size(); i++) {
    String[] str = strs.get(i).split("-");
    Long start = Long.parseLong(str[0]);
    Long end = Long.parseLong(str[1]);
    checkMaps.put(start, end);
}
/*重复区间收集*/
List<String> checkResult = new ArrayList<>();
for (int i = 0; i < strs.size(); i++) {
    String[] str = strs.get(i).split("-");
    Long start = Long.parseLong(str[0]);
    Long end = Long.parseLong(str[1]);
    /*遍历map 进行 比大小 */
    Set<Map.Entry<Long, Long>> set = checkMaps.entrySet();
    Iterator<Map.Entry<Long, Long>> iterator = set.iterator();
    while (iterator.hasNext()) {
        Map.Entry<Long, Long> data = iterator.next();
        Long key = data.getKey();
        Long value = data.getValue();
        if ((start >= key && start <= value) || (end >= key && end <= value)) {
            String result = key + "-" + value;
            /*由于两层遍历会导致数据重复,这里定义集合过滤、
              当然你也可以在外面定义flag标识并 return 防止重复执行而影响效率
            */
            if (!checkResult.contains(result)){
                System.out.println("重复数据区间:" +result);
                checkResult.add(result);
            }
        }
    }
}

成功输出所有重复数据:

 

以上就是校验数据的区间是否重复的全部代码。

Hutool 是一个 Java 工具类库,它提供了丰富的工具方法来简化开发过程。对于校验数据是否在指定表达式区间内的需求,可以通过 Hutool 提供的 `Validate` 类以及正则表达式或其他条件判断逻辑实现。 以下是具体的解决方案: ### 使用 Hutool 验证数据是否在指定范围内 #### 方法一:通过数值范围验证 如果目标是验证某个数值是否在一个特定的数值范围内,则可以直接使用 Hutool 的 `ValidatorUtil.between()` 方法完成验证操作。 ```java import cn.hutool.core.util.ValidatorUtil; public class RangeValidationExample { public static void main(String[] args) { double value = 15; boolean isValid = ValidatorUtil.between(value, 10, 20); // 判断value是否在[10, 20]之间 System.out.println(isValid ? "数据有效" : "数据无效"); } } ``` 这种方法适用于简单的数值范围验证[^4]。 --- #### 方法二:通过自定义表达式验证 当需要更复杂的验证逻辑时(例如基于某种计算公式或动态变化的边界),可以借助 Hutool 的 `StrUtil` 或者直接编写自定义函数来进行验证。 下面是一个例子,展示如何利用正则表达式或者手动解析表达式的上下限并进行比较: ```java import cn.hutool.core.lang.Assert; import cn.hutool.core.text.StrFormatter; public class ExpressionRangeValidation { /** * 自定义方法用于验证数据是否符合给定的表达式范围。 * * @param data 待验证的数据 * @param expression 表达式字符串,形如 "[min,max]" */ public static String validateDataInExpression(double data, String expression) { try { // 解析表达式中的最小值和最大值 int commaIndex = expression.indexOf(","); double minValue = Double.parseDouble(expression.substring(1, commaIndex)); double maxValue = Double.parseDouble(expression.substring(commaIndex + 1, expression.length() - 1)); // 进行范围验证 Assert.isTrue(data >= minValue && data <= maxValue, StrFormatter.format("数据 {} 不在指定范围 [{},{}] 内", data, minValue, maxValue)); return "数据有效"; } catch (Exception e) { return e.getMessage(); } } public static void main(String[] args) { String result = validateDataInExpression(18, "[10,20]"); System.out.println(result); } } ``` 在这个示例中,我们假设表达式的形式为 `[min,max]` 并对其进行了解析处理[^5]。 --- #### 方法三:扩展 Hutool Validator 功能 为了更加灵活地支持多种类型的范围验证场景,还可以考虑继承或封装现有的 Hutool 验证器组件,创建自己的专用验证器。 例如,你可以设计一个新的类专门负责复杂业务逻辑下的参数校验工作,并将其集成到项目框架之中以便重复调用。 --- ### 总结 以上介绍了三种不同的方式来解决“使用 Hutool 库校验数据是否在指定表达式区间内”的问题。每种方案都有其适用场合,在实际应用过程中可以根据具体需求选择合适的策略实施。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值