比较不同的对象

时间:2016-04-29 00:45:31

标签: java sorting

我有一个名为DrawingObject的抽象类,它由四个子类扩展:Point,Line,FreeFormLine和Circle。 DrawingObject实现了Comparable,我已经将compareTo方法定义为这个

public int compareTo(DrawingObject object)
{
    if(object instanceof Point && this instanceof Point)
    {
        //determine which has a higher value
        return 0;
    }
    else if(object instanceof Point && this instanceof Line)
        return 1;
    else if(object instanceof Point && this instanceof FreeFormLine)
        return 1;
    else if(object instanceof Point && this instanceof Circle)
        return 1;

    else if(object instanceof Line && this instanceof Point)
        return -1;
    else if(object instanceof Line && this instanceof Line)
    {
        //determine which has a higher value
        return 0;
    }
    else if(object instanceof Line && this instanceof FreeFormLine)
        return 1;
    else if(object instanceof Line && this instanceof Circle)
        return 1;

    else if(object instanceof FreeFormLine && this instanceof Point)
        return -1;
    else if(object instanceof FreeFormLine && this instanceof Line)
        return -1;
    else if(object instanceof FreeFormLine && this instanceof FreeFormLine)
    {
        //determine which has a higher value
        return 0;
    }
    else if(object instanceof FreeFormLine && this instanceof Circle)
        return 1;

    else if(object instanceof Circle && this instanceof Point)
        return -1;
    else if(object instanceof Circle && this instanceof Line)
        return -1;
    else if(object instanceof Circle && this instanceof FreeFormLine)
        return -1;
    else if(object instanceof Circle && this instanceof Circle)
    {
        //determine which has a higher value
        return 0;
    }

    return 0;
}

现在我有了这个,我想扩展代码按值排序。我很困惑如何去做这件事。例如,Point有两个实例字段,double x和double y。我很困惑哪个排序。我也对其他类型的对象以及如何对它们进行排序感到困惑。每个类都有一个equals方法,该方法在DrawingObject中声明为abstract,但在每个子类中实现。

以下是每个类中字段的说明: Point有两个双字段,x和y。它们表示该点的笛卡尔坐标网格上的坐标。 Line有两个Point字段,p1和p2。这些代表线的起点和终点。 FreeFormLine有一个ArrayList字段,分数。这表示沿线的所有点。 圆有一个点场,中心和一个双场半径。这些代表圆的中心点和半径。

总之,当有多个要评估的字段时,如何确定哪个对象具有更多或更少的值?

编辑: 进行此排序的目的是允许我使用二进制搜索有效地搜索DrawingObjects数组。

1 个答案:

答案 0 :(得分:1)

您尝试解决的问题比看起来要难得多,因为您正在尝试构建双重调度方法,即相对于两个对象是虚拟的方法。

有很多方法可以做到这一点,例如,使用访客模式,但是如果你可以在不同的类中建立一个固定的顺序(比如,一个点总是小于一个矩形,一个矩形小于一个你可以通过在基类中创建一个返回"排序顺序的受保护方法来使你的代码非常一致。对于班级:

protected abstract int sortOrder();

Point将返回0,矩形将返回1,line将返回2,依此类推。现在你的比较方法可以在两边调用sortOrder(),如果sort ordrrs不相同,你可以决定哪一个比另一个小。

如果排序顺序相同,那么类是相同的。在每个类中实现可比较,并在类相同时将调用转发给特定于类的比较方法。

就同一类的比较而言,你可以决定属性中的任意顺序 - 例如,y之前的x,宽度之前的高度等。只要你对应用规则保持一致,你的排序就是会好起来的。