今天项目需要 有交集返回false 场景如下
前端传几组数字 比如:
3 5
8 20
7 10
3 5 和8 20 不存在交集
但 8 20 和 7 10存在交集
这三组数字返回false
如果是这两组:
3 5
8 20
就返回true了
请问java代码怎么实现呢
实体
/**
Created by admin on 2018/6/20.
*/
public class NumEntity {
private Integer x;
private Integer y;
public Integer getX() {
return x;
}
public void setX(Integer x) {
this.x = x;
}
public Integer getY() {
return y;
}
public void setY(Integer y) {
this.y = y;
}
public NumEntity(Integer x, Integer y) {
this.x = x;
this.y = y;
}
}
主类
/**
Created by admin on 2018/6/20.
*/
public class CsdnMain {
/**
/**
/**
}
交集的规则,你需要说明一下才行,不空不容易写
8 20和7 10为什么会存在交集,规则是什么
可以将其放入一个 set,如果 set长度 == 数组1长度+数组2 + 数组N 长度,则说明 无交集,否则为有
最简单粗暴的方法,将每组数据的两个值分别判断是否在其他组的区间内就好了
Boolean IsCross(int x1, int y1, int x2, int y2)
{
return (x1 <= x2 && y1 >= x2) || (x1 <= y2 && y1 >= y2) || (x1 >= x2 && y1 <= y2) || (x1 <= x2 && y1 >= y2);
}
多个数字,就两两调用上面的
我再给你一个nlog(n)复杂度的:
class Data implements Comparable<Data> {
private int id;
private int value;
private boolean isStart;
public Data(int value, boolean isStart, int id) {
this.value = value;
this.isStart = isStart;
this.id = id;
}
public int getId() {
return id;
}
public boolean isStart() {
return isStart;
}
public int getValue() {
return value;
}
@Override
public int compareTo(Data o) {
Data that = (Data)o;
if (this.value < that.value) {
return -1;
}
else if (this.value > that.value) {
return 1;
}
return 0;
}
}
public class Test {
public static void main(String[] args) {
Object[] data = Arrays.asList(new Data(3, true, 1), new Data(5, false, 1),
new Data(8, true, 2), new Data(20, false, 2),
new Data(7, true, 3), new Data(10, false, 3)
).toArray();
Arrays.sort(data);
boolean isIntercepted = false;
for (int i=0; i<data.length; i+=2) {
if (((Data)data[i]).getId() != ((Data)data[i+1]).getId() ||
!((Data)data[i]).isStart() ||
((Data)data[i+1]).isStart()) {
isIntercepted = true;
break;
}
}
System.out.println("data are intercepted: " + isIntercepted);
}
}
可以换一个思路, 先把数组进行排序,然后比较两个数组的最小最大值。
minB <= minA <= maxB || minB <= maxA <= maxB || minA <= minB <= maxA || minA <= maxB <= maxA
package test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Test {
private static List list = new ArrayList();
public static void main(String[] args) {
//添加数组
list.add(new Integer[]{3,5});
list.add(new Integer[]{8,10});
// list.add(new Integer[]{5,15});
//处理
System.out.println(dealList());
}
private static boolean dealList() {
for(Integer[] IntArr1 : list){
for(Integer[] IntArr2 : list){
Arrays.sort(IntArr1);
Arrays.sort(IntArr2);
if(IntArr1[0] == IntArr2[0] && IntArr1[1] == IntArr2[1]){
continue;
}
if(IntArr1[0] >= IntArr2[0] && IntArr1[0] <= IntArr2[1]){
return true;
}
if(IntArr1[1] >= IntArr2[0] && IntArr1[1] <= IntArr2[1]){
return true;
}
}
}
return false;
}
}