有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

编写表示区间和区间列表的Java类的算法

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

Considering that CInterval can implement any interval: (a,b), and CIntervalList implements a reunion of distinct intervals, it is required to write an IntervalList method that intersects two intervals.

如果有更好的方法来设计这两个类,你能提供一些建议吗? 如果需要工会怎么办?区间的并集并不总是区间,因此如何更改方法的返回类型? 如果您对设计类有更好的建议,那么至少给出方法签名(如果不是整个正文的话)会有所帮助。非常感谢。 另外,你认为为什么需要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) 个答案

  1. # 1 楼答案

    一大堆话

    • CInterval intersection(CInterval x, CInterval y)应该是静态的,这就是为什么它在CIntervalList中像Files在Java中或CollectionsPaths
    • ab没有那么有意义!而是使用bornSup和bornInf或左、右或结束开始
    • CInterval的参数创建构造函数public CInterval(int a,int b, boolean vd)
    • 你想过使用Math.minMath.max
    • 当您访问像这样的实例变量vdz.vd = ...,您没有考虑封装oo主体。尝试为你的类设置getter和setter CInterval
    • 如果其中一个间隔无效,在这种情况下,将z间隔设置为Void one,因此if(x.vd == true || y.vd = true)
    • 不需要写这个} else if(x.a > y.a)只要}else就足够了

    PS:但我认为你的问题更适合https://codereview.stackexchange.com/

  2. # 2 楼答案

    相交函数可以简单得多,如下所示:

    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;
    }
    

    不过,您的解决方案可能会更好地优化速度。在一个紧密循环的情况下,这么详细可能是值得的,但总的来说,可读性&;优先考虑可维护性