Java,在整数列表中查找交集
我有一个对象数组列表,如:Java,在整数列表中查找交集,java,algorithm,Java,Algorithm,我有一个对象数组列表,如: {{"ObjectName",[[1,3],[11,24]]}, {"ObjectName2",[[3,4],[5,6],[12,20]]}, {"ObjectName3",[[30,38]]}} 对象由一个字符串(对象名)和整数列表中的多对整数列表组成 一对整数列表,如[11,24]:表示从11cm到24cm的长度范围 如何使用Java代码和lessbigO检查1个对象的长度对是否与其他对象的长度范围相交。与ObjectName类似,ObjectName 2有一对
{{"ObjectName",[[1,3],[11,24]]},
{"ObjectName2",[[3,4],[5,6],[12,20]]},
{"ObjectName3",[[30,38]]}}
对象由一个字符串(对象名)和整数列表中的多对整数列表组成
一对整数列表,如[11,24]:表示从11cm到24cm的长度范围
如何使用Java代码和lessbigO检查1个对象的长度对是否与其他对象的长度范围相交。与ObjectName类似,ObjectName 2有一对整数[12,20]与ObjectName的[11,24]相交
我有一个sudo代码有bigO(n^3):
for(对象o1:Arraylist){
用于(对象o2:Arraylist){
对于(int x=0;x=o2.lengthlist.get(x)[0]
&&o1.lengthlist.get(x)[1]我做了一个完整的例子来说明如何做
第一类
package intersectioninintegerlist;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
*
* @author Ahmad
*/
public class IntersectionInIntegerList {
public static void main(String[] args) {
List<Pair> lst1 = new ArrayList<>(Arrays.asList(new Pair(1,3), new Pair(11,24)));
Obj obj1 = new Obj("obj1", lst1);
List<Pair> lst2 = new ArrayList<>(Arrays.asList(new Pair(3,4), new Pair(5,6), new Pair(12,20)));
Obj obj2 = new Obj("obj2", lst2);
List<Pair> lst3 = new ArrayList<>(Arrays.asList(new Pair(30,38)));
Obj obj3 = new Obj("obj3", lst3);
List<Obj> objs = new ArrayList<>(Arrays.asList(obj1, obj2, obj3));
for(int i = 0; i < objs.size(); i++){
for(int j = i+1; j < objs.size(); j++){
findIntersect(objs.get(i), objs.get(j));
}
}
}
private static void findIntersect(Obj o1, Obj o2) {
System.out.println(o1.name + " - " + o2.name);
for(Pair p1 : o1.pairs){
for(Pair p2 : o2.pairs){
int A = p1.i1;
int B = p1.i2;
int X = p2.i1;
int Y = p2.i2;
if((A >= X && A <= Y) || (X >= A && X <= B)){
System.out.println(o1.name + " intersects with " + o2.name);
}
}
}
}
}
希望能有所帮助。除非你编写一些代码,否则无法找到值的交集。这是“对象恐惧症”的一个例子反模式。不存储数组,而是创建一个范围类来封装每对整数,并为该类提供一个方法,如intersects
或overlaps
。然后,您可能希望使用该方法编写一个静态方法,该方法将对多个范围实例进行检查。如果每个元素都是在定义的时间间隔内。可能需要确保o1!=o2,并且if语句的第二部分同时检查数组位置[1]。milkmua BigO不是通过嵌套循环的数量来衡量的。如果定义了n,它有时可以用作确定最坏情况下运行时间的快捷方式。在您的情况下,您使用的是“n^3”,但您尚未定义n,并且其中一个for循环具有不同的界限。如果您将n定义为范围总数,则答案是您必须对照其他范围检查每个范围,给出n^2。bigO的算法是什么?基本上,您需要循环列表两次,以便现在将每个对象与其他对象进行比较2个需要比较的对象,你必须测试对象A和对象B的间隔。所以我想这是你能得到的最小复杂度。@Sleimanjaneidi我不知道这是一个家庭作业,我一读到主题就开始编码,因为我喜欢它algorithms@AhmadHammoud你喜欢算法是好的,但你不应该这样e你的time@milkmuaintersect函数为n^2
package intersectioninintegerlist;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
*
* @author Ahmad
*/
public class IntersectionInIntegerList {
public static void main(String[] args) {
List<Pair> lst1 = new ArrayList<>(Arrays.asList(new Pair(1,3), new Pair(11,24)));
Obj obj1 = new Obj("obj1", lst1);
List<Pair> lst2 = new ArrayList<>(Arrays.asList(new Pair(3,4), new Pair(5,6), new Pair(12,20)));
Obj obj2 = new Obj("obj2", lst2);
List<Pair> lst3 = new ArrayList<>(Arrays.asList(new Pair(30,38)));
Obj obj3 = new Obj("obj3", lst3);
List<Obj> objs = new ArrayList<>(Arrays.asList(obj1, obj2, obj3));
for(int i = 0; i < objs.size(); i++){
for(int j = i+1; j < objs.size(); j++){
findIntersect(objs.get(i), objs.get(j));
}
}
}
private static void findIntersect(Obj o1, Obj o2) {
System.out.println(o1.name + " - " + o2.name);
for(Pair p1 : o1.pairs){
for(Pair p2 : o2.pairs){
int A = p1.i1;
int B = p1.i2;
int X = p2.i1;
int Y = p2.i2;
if((A >= X && A <= Y) || (X >= A && X <= B)){
System.out.println(o1.name + " intersects with " + o2.name);
}
}
}
}
}
package intersectioninintegerlist;
import java.util.List;
/**
*
* @author Ahmad
*/
public class Obj {
public String name;
public List<Pair> pairs;
public Obj(String n, List<Pair> p){
name = n;
pairs = p;
}
}
package intersectioninintegerlist;
/**
*
* @author Ahmad
*/
public class Pair {
int i1;
int i2;
public Pair(int _i1, int _i2){
i1 = _i1;
i2 = _i2;
}
}