这是解决以下问题的一个相对较好的解决方案:
考虑到CInterval可以实现任何间隔:(a,b),和 CIntervalList实现了不同间隔的重聚,这是必需的 编写一个与两个区间相交的IntervalList方法。
如果有更好的方法来设计这两个课程,请提供建议吗?
如果要求工会怎么办?区间的并集并不总是一个区间,那么如何更改方法的返回类型?
如果你有更好的设计类的建议,那么至少给出方法签名是有帮助的,如果不是整个身体的话。提前谢谢了。
PS。为什么你认为需要CIntervalList?我可以在CInterval本身中使用一个名为intersect的方法,其方法如下:
可以像CInterval intersection(CInterval x)
Interval3 = Interval1.intersection(Interval2)
class CInterval
{
int a;
int b;
boolean vd = false; //(void intervals are marked with vd = true)
}
class CIntervalList
{
CInterval intersection(CInterval x, CInterval y)
{
CInterval z = new CInterval();
if(x.vd == false || y.vd = false)
{
z.vd= true;
return z;
}
else if(x.a < y.a)
{
if(x.b < y.a)
{
z.vd= true;
return z;
} else
{
if(x.b < y.b)
{
z.a = y.a;
z.b = x.b;
return z;
}
else
{
z.a = y.a;
z.b = y.b;
return z;
}
}
} else if(x.a > y.a)
{
if(y.b < x.a)
{
z.vd= true;
return z;
} else
{
if(y.b < x.b)
{
z.a = x.a;
z.b = y.b;
return z;
}
else
{
z.a = x.a;
z.b = x.b;
return z;
}
}
}
}
}
答案 0 :(得分:0)
CInterval intersection(CInterval x, CInterval y)
应该是静态,这就是为什么它在CIntervalList
中与Files
一样在Java或Collections
,Paths
...... CInterval
public CInterval(int a,int b, boolean vd)
和Math.min
?Math.max
这样的实例变量vd
时,您没有考虑到主体的封装。尝试为您的课程z.vd = ...
设置Getters和Setters。CInterval
if(x.vd == true || y.vd = true)
只需} else if(x.a > y.a)
即可。 PS :但我认为您的问题更适合https://codereview.stackexchange.com/
答案 1 :(得分:0)
交叉函数可以更简单,如下所示:
CInterval intersection(CInterval x, CInterval y)
{
CInterval z = new CInterval();
if(x.vd == false || y.vd = false)
{
z.vd= true;
return z;
}
z.a = Math.max(x.a, y.a);
z.b = Math.min(x.b, y.b);
z.vd = z.a <= z.b;
return z;
}
但是,您的解决方案可能会针对速度进行更好的优化。在一个紧凑的循环情况下,可能值得那么冗长,但总的来说,可读性&amp;保持稳定性。