2016-04-29 191 views
-1

我有一個名爲DrawingObject的抽象類,它被四個子類擴展:Point,Line,FreeFormLine和Circle。 DrawingObject實現可比性,我已經定義了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中聲明爲抽象,但在每個子類中實現。

以下是每個班級中的字段說明: Point有兩個雙字段,x和y。這些表示該點的笛卡爾座標網格上的座標。 線有兩個點字段,p1和p2。這些代表了該線的起點和終點。 FreeFormLine有一個ArrayList字段,分。這代表了沿線的所有點。 圓有一個點域,中心和一個雙半徑域。這些代表圓的中心點和半徑。

總之,當有多個字段需要評估時,如何確定哪個對象具有更多或更少的價值?

編輯: 做這種排序的目的是讓我能夠通過使用二進制搜索的DrawingObjects數組有效地進行搜索。

+0

這是你必須回答的問題。它太寬泛 - 例如它可能基於線長(或圓半徑)或線的最左點(假設爲2D)。沒有普遍的答案。 – John3136

+0

我意識到這一點。我更多的是尋求建議,而不是具體的答案。 – Jacob

+0

「排列形狀列表」甚至意味着什麼?我們如何知道你爲什麼這樣做?沒有更多的信息,就不能給出明智的答案。 – John3136

回答

1

您嘗試解決的問題比ut好得多,因爲您正在嘗試構建一個雙重調度方法,即針對兩個對象虛擬的方法。

有辦法可以做到這一點,例如,使用訪問者模式,但如果你在跨不同類別建立固定順序方面會很好(例如,一個點總是小於一個矩形,一個矩形小於線等),你可以讓你的代碼非常一致通過在基類保護的方法,它返回的「排序」的類:

protected abstract int sortOrder(); 

點會返回0,矩形將返回1,行將返回2,依此類推。現在,您的比較方法可以在兩邊調用sortOrder(),並且如果排序ordrrs不相同,則可以決定哪一個小於另一個。

如果排序順序相同,那麼類是相同的。在每個類中實現類比,並在類相同時將該調用轉發給特定於類的比較方法。

只要對同一個類進行比較,您可以決定屬性之間的任意排序 - 比方說y之前的x,寬度之前的高度等等。只要您對應用規則一致,您的排序將會很好。