2016-04-29 8 views
-1

Ich habe eine abstrakte Klasse namens DrawingObject, die um vier Unterklassen erweitert wird: Point, Line, FreeFormLine und Circle. DrawingObject implementiert Comparable und ich habe die Methode compareTo definiert wie dieseVergleichen verschiedener Objekte

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

Jetzt zu sehen, dass ich das ich den Code die Sortierung nach Wert verlängern möchte. Ich bin verwirrt, wie ich das machen soll. Zum Beispiel hat Punkt zwei Instanzfelder, doppeltes x und doppeltes y. Ich bin verwirrt, wonach ich sortieren soll. Ich bin auch verwirrt über die anderen Arten von Objekten und wie man sie sortiert. Jede Klasse verfügt über eine equals -Methode, die in DrawingObject als abstrakt deklariert, jedoch in jeder Unterklasse implementiert ist.

Hier sind die Beschreibungen der Felder in jeder Klasse: Punkt hat zwei doppelte Felder, x und y. Diese repräsentieren die Koordinaten in einem kartesischen Koordinatengitter des Punktes. Zeile hat zwei Punktfelder, p1 und p2. Diese repräsentieren den Start- und Endpunkt der Linie. FreeFormLine hat ein ArrayList-Feld, Punkte. Dies stellt alle Punkte entlang der Linie dar. Kreis hat ein Punktfeld, Zentrum, und ein Doppelfeld, Radius. Diese repräsentieren den Mittelpunkt und den Radius des Kreises.

Zusammenfassend, wie kann ich feststellen, welches Objekt mehr oder weniger Wert hat, wenn mehr als ein Feld ausgewertet werden soll?

Bearbeiten: Der Zweck dieser Sortierung ist es, mich effizient durch eine Reihe von DrawingObjects mit binärer Suche suchen.

+0

Das ist etwas, was Sie beantworten müssen. Es ist zu breit - beispielsweise könnte es auf der Linienlänge (oder dem Kreisradius) oder dem am weitesten links liegenden Punkt der Linie (2D vorausgesetzt) ​​basieren. Es gibt keine allgemeine Antwort. – John3136

+0

Ich bin mir dessen bewusst. Ich suche mehr Rat als eine konkrete Antwort. – Jacob

+0

Was bedeutet "eine Liste von Formen sortieren"? Woher wissen wir, warum Sie es tun? Ohne weitere Informationen kann keine vernünftige Antwort gegeben werden. – John3136

Antwort

1

Das Problem, das Sie zu lösen versuchen, ist viel schwieriger als ut scheint, weil Sie versuchen, eine doppelte Dispatch-Methode zu erstellen, d. H. Eine Methode, die virtuell in Bezug auf zwei Objekte ist.

Es gibt Möglichkeiten, dies zu tun, zum Beispiel mit einem Besuchermuster, aber wenn Sie eine feste Reihenfolge über verschiedene Klassen (z. B. ein Punkt ist immer kleiner als ein Rechteck, ein Rechteck ist kleiner als eine Linie, etc.) können Sie Ihren Code sehr konsistent machen, indem eine geschützte Methode in der Basisklasse zu machen, dass die „Sortierreihenfolge“ für die Klasse zurückgibt:

protected abstract int sortOrder(); 

Punkt würde 0 zurück, würde Rechteck 1 zurückzukehren, Zeile würde 2 zurückgeben und so weiter. Jetzt könnte Ihre Vergleichsmethode sortOrder() auf beiden Seiten aufrufen und entscheiden, welche weniger als die andere ist, wenn die Sortierreihenfolgen nicht die gleichen sind.

Wenn Sortierreihenfolgen gleich sind, dann sind die Klassen gleich. Implementieren Sie in jeder Klasse vergleichbar und leiten Sie den Aufruf an eine klassenspezifische Vergleichsmethode weiter, wenn Klassen gleich sind.

Soweit Vergleich der gleichen Klasse geht, können Sie auf eine beliebige Reihenfolge unter den Attributen entscheiden - sagen wir, x vor y, Höhe vor Breite usw. Solange Sie konsequent bei der Anwendung Ihrer Regeln, Ihre Bestellung wird gut.

Verwandte Themen