编写表示间隔和间隔列表的Java类

时间:2015-06-07 15:21:57

标签: java algorithm class intervals

这是解决以下问题的一个相对较好的解决方案:

  

考虑到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;
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

一堆言论

  • CInterval intersection(CInterval x, CInterval y)应该是静态,这就是为什么它在CIntervalList中与Files一样在Java或CollectionsPaths ......
  • a b 不是那么有意义的!而是使用bornSup和bornInf或左右或结束开始
  • 使用[{1}} ... CInterval
  • 的参数创建构造函数
  • 您是否考虑过使用public CInterval(int a,int b, boolean vd)Math.min
  • 当您访问像Math.max这样的实例变量vd时,您没有考虑到主体的封装。尝试为您的课程z.vd = ...设置Getters和Setters。
  • 如果其中一个区间为Void,则在这种情况下将 z 区间设置为Void 1,因此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;保持稳定性。