(有单个数字也有区间范围的,区间范围的:起始和结束的长度要一样比如100-600,但1-50就不行,要改为01-50)
要比较数字有没冲突
数字可以是一个的或是范围的,比较5,6-9
那么8就跟上面的冲突了
如果11-14,那么13-19也不行,因为有交叉了。
现在问题是如果有这样的数字 1,3,5,6-9,8,120-150,130-180,怎么判断有冲突,冲突的有哪些?谢谢! :oops:
[code="java"]
package com.chinahrt.zyn.iteye;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class NumTest {
public static class StringNum implements Comparable{
private String s;
private Integer first;
private Integer last;
public StringNum (String s){
this.s = s;
String str[] = s.split("-");
if(str.length>1){
first = Integer.valueOf(str[0]);
last = Integer.valueOf(str[1]);
}else{
first = Integer.valueOf(str[0]);
last = 0;
}
}
public int compareTo(Object o) {
StringNum sn = (StringNum)o;
if(first>sn.first){
return 1;
}else if(first.equals(sn.first)){
return 0;
}else{
return -1;
}
}
}
public static void testUnit(List<StringNum> list){
Collections.sort(list);
for(int i=0;i<list.size();i++){
StringNum s = list.get(i);
// System.out.println(s.s);
if(s.last>0){
for(int j=i+1;j<list.size();j++){
StringNum s1 = list.get(j);
if(s.last>=s1.first){
System.out.println(s.s+"和"+s1.s+"冲突!");
}
}
}
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
List<StringNum> list = new ArrayList<StringNum> ();
list.add(new StringNum("1"));
list.add(new StringNum("3"));
list.add(new StringNum("5"));
list.add(new StringNum("6-9"));
list.add(new StringNum("8"));
list.add(new StringNum("120-150"));
list.add(new StringNum("130-180"));
list.add(new StringNum("001-010"));
list.add(new StringNum("0001-0010"));
testUnit(list);
}
}
[/code]
把所有的数字都看成0长度的区间,然后把所有的区间构成数值排序,区间两端数值的序号连续的一般不会重复,去除相等碰撞的。这就是个一维的碰撞检测。
可不可以这样来处理1.你上面的数有两种情况装换为一个种例如:5->5-5;
2.处理碰撞区域。循环遍历两次找出两两存在碰撞的的区域