o.compareTo(o)

  • Themenstarter Themenstarter Morlon
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
M

Morlon

Gast
Grüße,
ich hab ein kleines Problem und weiß einfach nicht weiter.
Ich versuch mich gerade an meinem ersten Baum und muss dazu neue Objecte mit denen im Baum vergleichen können.
In meinen Baum füge ich nur Objecte des Typs MyElement ein. Eine Klasse, die compareable ist.
Damit mein Baum jetzt aber nicht auf MyElement's beschränkt ist übergebe ich dem Baum Objects.

Zum Einfügen eines neuen Objektes in meinen Baum durchsuch ich nun den Baum und vergleiche mittels compareTo.
Das ganze sieht dann in etwa so aus:

Code:
	public Node search(Object o, Node n)
	{
		Object old = array[(int)n.o];       //Das Object, dass sich bereits im Baum befindet
		int compare = o.compareTo(old);
		[...]
	}
Jetzt habe ich aber das Problem, dass mein Baum nicht weiß, dass o ein MyElement ist. Versucht also auf compareTo von java.lang.Object zu zugreifen, was natürlich nicht geht.
Was funktionieren würde, o in MyElement parsen, aber dann würde der tree nur noch mit MyElements funktionieren.

Kann mir jemand weiter helfen?
Wäre euch sehr dankbar,
Morlon
 
Es spielt keine Rolle, ob eine Referenz auf eine MyElement-Instanz als MyElement oder als Object deklariert ist; wenn Du in MyElement compareTo( Object) überschreibst, dann wird zur Laufzeit auch die richtige Methode gezogen.
 
Aber sowohl BlueJ als auch Eclipse bekomm ich folgende Meldung:
The method compareTo(Object) is undefined for the type Object
 
Vielleicht hab ich auch in der MyElement ein Fehler.
Hier mal ein paar Schnippsel:
Code:
import java.lang.Comparable;
 
public class MyElement implements Comparable
{
	private String s1,
			         s2;
	private double d1;

    public MyElement(String s1, String s2, double d1) 
    {
        this.s1 = s1;
        this.s2 = s2;
        this.d1 = d1;
    }

    [...]

	public int compareTo(Object o)
	{
		MyElement o2 = (MyElement) o;
		return s1.compareTo( o.getS1());
	}
}

Zum Vergleichen soll halt der String s1 verwendet werden.
 
Morlon hat gesagt.:
Aber sowohl BlueJ als auch Eclipse bekomm ich folgende Meldung:
The method compareTo(Object) is undefined for the type Object

Das liegt daran, dass diese Methode im Typ Object als protected deklariert ist. Damit sie benutzbar wird, muss man sie überschreiben und public deklarieren.
 
Kann schon sein. Aber dein Codeschnipsel ist eh so klein, dass ich nicht alle möglichen Fehler hinzudenken kann. Fangen wir doch mal bei der überschriebenen compareTo an:
Deine Codezeile 'return s1.compareTo(o.getS1());' müsste eigentlich einen Compilerfehler werfen, da o der Parameter vom Typ Object ist.
 
hubs, nein im code stehts richtig. hatte beim rüberkopieren wohl irgendwo die 2 verschluckt.

Aber mir fällt gerade etwas anderes auf. Mein Tree weiß ja noch garnicht, dass o ein MyElement ist, da er ja erst zur Laufzeit ein Object erhält. Also kann er auch noch nicht wissen, dass compareTo überschrieben 'sein wird'.

Daher meckert der Compiler, dass es o.compareTo() nicht gibt.

Aber weiter hlft mir der Geistesblitz jetzt auch nich 😉
 
Wenn ich in den Tree nen neues Objekt einfüg muss ich doch die einzelnen Objekte im Tree vergleichen um die richtige Stelle zu finden.
Ich will also wissen welchen meiner beiden MyElement größer/kleiner ist.
 
Für den Compiler ist "o" nur ein Object, und das besitzt keine "compareTo"-Methode.

Entweder übergibst du ein "Comparable o" (was ich persönlich besser fände) oder du machst einen Cast auf Comparable: "((Comparable)o).compareTo( ... )".
 
Hmm. Ich weiß ja nicht, was das für ein Baum werden soll -- wenn ich nach größer/kleiner entscheide, habe ich eigentlich eine sortierte Liste und keinen Baum ... verstehe ich nicht ganz :bahnhof:
 
Danke Beni, werd ich nachher mal testen.
@SamHotte, einen Sinn soll der Baum nich haben. ist nen bbaum, der mit einem array gekoppelt ist. Ich bin noch java-anfänger und will einfach mal testen was wie geht.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben