eigener Mergesort auf generischen Typen mit Comparator

  • Themenstarter Themenstarter Xuri0
  • Beginndatum Beginndatum
X

Xuri0

Gast
Hallo Leute,
Ich dachte ich komme vorerst damit durch hier nur zu lesen, jedoch sitzte ich nun schon seit 2 Tagen an einer für mich einfach unlösbaren Aufgabe.
Es geht darum, auf einer Liste, selber Mergesort zu implementieren und zwar so, dass der Aufwand bei n*log(n) bleibt.
Das ist ja auf Listen eher unmöglich. Also wird die generische Liste in ein generisches Array überführt.
Ich hab jetzt nur riesige Problem mit Comparable, Comparator, compareTo und compare Sachen.

Ist nebenbei eine HA für Informatik 2 Sem., wollte das eigentlich allein hinbekommen, aber da heute Abend Abgabe ist musste ich jetzt fragen.

Habe mal mein Projekt angehangen, es geht um die LinkedList.java , die LinkedTest.java sollte dann durchlaufen können.

- Danke und Grüße
 

Anhänge

Wie wäre es, wenn du dein Problem mal genauer beschreibst. Nicht alle von uns haben zu Hause eine Glasskugel stehen. ;-)

Ich habe auch kein, wenn ich auch nur halbwegs wüsste wo ich bei den beschriebenen Anweisungen irgendwo einen Fehler drin habe würde ich hier nicht fragen. Haben leider keine Einführung zu Comparator und Comparable bekommen. Habe mithilfe von Eclipse und einigen Onlinebeispielen halt alles so hinbasteln können wie es jetzt ist.
Aber kommen beim Ausführen halt noch Fehler, die sich auf die compareTo Funktion beziehen, aber was dabei oder in der Verwendung falsch läuft weiss ich nicht.

Die Test.java muss halt durchlaufen und die vorallem es endlich schaffen, dass die eigentliche LinkedList.java die Liste in ein Object Array zu formt, dieses zu sortieren und dass dann wieder als "neue" Liste auszugeben.

Wenn man die .compareTo leer lässt und lediglich return 0 setzt, kann das Programm die Liste und Mergesort wenigstens ausgeben, aber wird halt nichts getauscht.
 
Implementiere bei deiner Klasse ListeEle das Interface Comparable<T> und füge dann die Funktion:
Java:
    @Override
    public int compareTo(T comparedObject){

       return ((Comparable)(comparedObject)).compareTo(element);
    }
hin zu.

Schau dir an, was compareTo je nach Vergleichsobject zurückgibt, und dann kannste dich an Mergesort wagen.

Du kannst auch einfach
Collections.sort(deineListe);
machen, wenn deine Liste das Interface Comparable implementiert hat. das nutzt dann auch Mergesort zum sortieren 😀
 
Implementiere bei deiner Klasse ListeEle das Interface Comparable<T> und füge dann die Funktion:
Java:
    @Override
    public int compareTo(T comparedObject){

       return ((Comparable)(comparedObject)).compareTo(element);
    }
hin zu.

Schau dir an, was compareTo je nach Vergleichsobject zurückgibt, und dann kannste dich an Mergesort wagen.

Du kannst auch einfach
Collections.sort(deineListe);
machen, wenn deine Liste das Interface Comparable implementiert hat. das nutzt dann auch Mergesort zum sortieren 😀
Dürfte ich .sort nutzen, hätte ich dies getan.
compareTo gibt ein int <= 0 == 0 oder >= 0 zurück ... wusste ich schon vorher. Hilft mir aber nicht, trägt zumidnest nicht zu meinem Verständniss bei.
 
Ok, dann versteh ich dein Problem nicht.
Versteht du MergeSort allgemein nicht
oder
Verstehst du nicht, wie man das Comparable oder den Comperator benutzt?
oder
Was ganz anderes?
 
Ok, dann versteh ich dein Problem nicht.
Versteht du MergeSort allgemein nicht
oder
Verstehst du nicht, wie man das Comparable oder den Comperator benutzt?
oder
Was ganz anderes?

Ich verstehe Comparable und Comperator nicht.
Weis nicht so richtig wann ich das wo implementieren muss, da hilft mir Eclipse aber halbwegs durch.
Vorallem ist mir auch rätselhaft, warum ich bei mergesort das auch so dumm dieses cmp (Comparator<T> cmp) immer übergeben muss und was das dann soll.
So wie ich denke ist cmp ja der int wert, welcher aus cmp.compare(T o1, T o2) resultieren würde.

Aber ich habe auch kA ob und wo, und auch nicht warum, ich nicht einfach compare nutzen kann.
Das Wichtigste ist aber halt: Was muss ich denn jetzt machen, damit compare auf den generischen Typen läuft. Ich muss irgendwie mit @override benutzen und dann die compare methode definieren. Aber in der LinkesList.java oder in der ListElem.java?
Was muss dann darein, hatte es selber schon ewig versucht und eben nochmal in dein Beispiel alles möglich eingesetzt aber es geht nach wie vor nicht.


EDIT:
Habe das eigentlich so verstanden, dass der Quellcode von dir in die ListElem.java rein müsste.
Aber Fehlerfrei geht das nur so:
Java:
	 public int compareTo(T comparedObject){
	 
	       return ((Comparable)(comparedObject)).compareTo(this);
	    }
Dann funktioniert ws aber dennoch nicht (geht das überhaupt ohne @Override
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben