校验区间范围是否重复

判断区间是否重复重叠

例如:
第一组区间: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);
            }
        }
    }
}

成功输出所有重复数据:

 

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值