判断区间是否重复重叠
例如:
第一组区间: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);
}
}
}
}
成功输出所有重复数据:
以上就是校验数据的区间是否重复的全部代码。