Eigenen Comparator schreiben ?

Status
Nicht offen für weitere Antworten.
R

redbomber

Gast
Hi zusammen:

Ich habe eine Frage, bzw. vielmehr ein Problem.

Ich besitze eine LinkedList<Object> in sich Objekte befinden.
Diese Objekte besitzen eine Eigenschaft (-> z.B.: Alter), nachdem ich diese Objekte sortieren möchte.
Diser Vorgang findet nur 1 mal ganz zu Beginn statt.

Bisher erstelle ich einfach eine neue LinkedList<Object> und führe im grunde einen insertionsort aus.
Also füge ich Object für Object in die neue Liste an der passenden Stelle ein, indem ich das Alter des neu einzufügenden Objekts mit dem Alter der schon eingefügten Objekte vergleiche.
Sobald ich ein älteres Objekt finde habe ich meine Einfügeposition gefunden.

Dies klappt auch alles soweit ganz gut, die Laufzeit ist jedoch sehr schlecht (im schlechtesten Fall O(n^2)).
Dies merke ich wenn ich größere Daten einlese, dann braucht der wirklich viel zu lange um die Objekte zu sortieren.


Jetzt habe ich gehört, dass man seinen eigenen Comparator programmieren kann, welcher die Sortierung schneller durchführt. Wisst ihr wie so etwas funktioniert? Macht so etwas sinn?

Oder habt ihr mir vielleicht einen anderen Tip wie ich das Sortieren schneller gestalten kann?[/quote]
 

Der Müde Joe

Top Contributor
es gibt 2 möglichkeiten zu sortieren:

Collections.sort mit dem entsprechenden Comparator.

oder eine bereits sortierende Collection und das zu sortierenden
Objekt Comparable implementieren lassen.

bei einmal würd ich den comparator wählen:
Code:
		List<Person> list = new ArrayList<Person>();
		Collections.sort(list, new Comparator<Person>() {

			@Override
			public int compare(Person o1, Person o2) {
				// oder was auch immer
				return o1.getAge() - o2.getAge();
			}
		});

	class Person {

		int getAge() {
			return 0;
		}
	}
 
R

redbomber

Gast
super vielen Dank!

Die Methode
Code:
Collections.sort(list, new Comparator<Person>() {

         @Override
         public int compare(Person o1, Person o2) {
            // oder was auch immer
            return o1.getAge() - o2.getAge();
         }
      });

Wo muss diese genau implementiert werden?
Wie bei dir in dem Beispiel an der Stelle wo ich meine sortierte Liste erzeugen möchte?

Also ich frage daher, da ich mir gerade versuche vorzustellen, woher der compiler weiss, dass diese compare Methode verwendet werden soll.
 

Ark

Top Contributor
Das muss nicht der Compiler wissen, sondern die Sortiermethode, und die wiederum ist so gebaut, dass sie einen ganz konkreten Comparator erwartet und auch benutzt. Deswegen musst du einen solchen angeben (hast du ja schon getan).

Was die Implementierung betrifft: Es ist völlig egal, wo sie steht oder wo sie herkommt; Hauptsache, sie erfüllt die Schnittstellenspezifikation:
a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second.
Und das dürfte bei dir wohl auch der Fall sein.

Ark
 

Murray

Top Contributor
redbomber hat gesagt.:
Die Methode
Code:
Collections.sort(list, new Comparator<Person>() {

         @Override
         public int compare(Person o1, Person o2) {
            // oder was auch immer
            return o1.getAge() - o2.getAge();
         }
      });

Wo muss diese genau implementiert werden?
Das ist eigentlich keine Methode, sondern ein Methodenaufruf, bei dem allerdings ein Parameter eine anonymous inner class ist, in der wiederum eine Methode (nämlich compareTo) implementiert ist.

Vielleicht wird es deutlicher, wenn man für den Comparator eine lokale Variable einsetzt:
Code:
Comparator<Person> persComp = new Comparator<Person>() {

         @Override
         public int compare(Person o1, Person o2) {
            // oder was auch immer
            return o1.getAge() - o2.getAge();
         }
      };
Collections.sort(list, persComp);
 

Der Müde Joe

Top Contributor
>Wo muss diese genau implementiert werden?

Der Comparator kann eine eigene Klasse sein und muss nicht eine innerer Klasse sein. Er muss lediglich die Methode compare überschreiben.

zB:
Code:
import java.util.Comparator;

public class AgeComparator implements Comparator<Person> {
	
	@Override
	public int compare(Person o1, Person o2) {
		return o1.getAge() - o2.getAge();
	}
}

>Wie bei dir in dem Beispiel an der Stelle wo ich meine sortierte Liste erzeugen möchte?

Der Aufruf von Collections.sort sortiert dann auch die Liste. Wenn du dann was addedst ist sie wieder unsortiert.

Code:
		//vergleicht Personen nach alter
		AgeComparator comp = new AgeComparator();
		
		List<Person> persons = new ArrayList<Person>();
		
		//adde ein paar Personen
		persons.add(...);
		persons.add(...);
		persons.add(...);
		
		//sortiere unsortierte List nach alter
		Collections.sort(persons, comp);
		
		// hier sind alle Personen dem Alter nach sortiert
		
		//diese Person wird wieder irgendwo in der Liste geadded (am Schluss)
		persons.add(...);

		// die Liste ist wieder unsortiert
 
R

redbomber

Gast
noch eine letzte Frage, sorry.

Angenommen bei der Eigenschaft welche ich überprüfe, handelt es sich um keine integer-Werte sondern um Werte vom Typ long.
Wie kann ich dies dann beheben?
 
R

redbomber

Gast
Habs einfach gecasted und jetzt geht alles!

Vielen Dank euch allen!
Jetzt bin ich mal gespannt ob dieser Comparator schneller sortiert als mein langsamer insertion sort ;)
 

0x7F800000

Top Contributor
redbomber hat gesagt.:
Habs einfach gecasted und jetzt geht alles!
Bist du dir da so sicher? ;) Dann schau dir bitte die ausgabe von
Code:
System.out.println((int)Long.MAX_VALUE);
an, und überlege dir, ob das nicht evtl doch schief gehen könnte

(wenn du es einfach mit
Code:
return (int)(firstLong-secondLong);
machst, wird es definitiv schief gehen)

Ferner solltest du dir im klaren sein, was die compare-methode ausgibt:
API hat gesagt.:
Returns a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second.
d.h. du musst da keine differenzen oder sonstigen Kram ausgeben. -1, 0, 1 als ausgabe reichen schon vollkommen.
 
R

redbomber

Gast
uiuiui :?

Habs gleich behoben.

Die Reihenfolge war zwar korrekt, aber hatte auch keine so große Werte die nicht auch als integer hätten dargestellt werden können. Daher hat es korrekt sortiert.

Jetzt mache ich aber davor die Abfrage und gebe dann entsprechend -1/0/+1 zurück.
Vielen Dank nochmal!
 

0x7F800000

Top Contributor
deine alte comparator-methode kannst du nach einer kleinen modifikation immer noch zum pseudo-zufälligen durchmischen der Liste verwenden, wenn du willst ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Addons im eigenen Programm Allgemeine Java-Themen 1
E Eigenen "Aufzählungstyp" erstellen - mit enum ? Allgemeine Java-Themen 18
S Parametrisierte jUnit 5-Tests mit eigenen Datentypen/Klassen-Objekten als Test-Parameter Allgemeine Java-Themen 0
dereki2000 Eigenen Zeichensatz benutzen Allgemeine Java-Themen 7
B JAVA Prozesse in einer eigenen Anwendung laufen lassen Allgemeine Java-Themen 9
J Java eigenen Button programmieren (ob Cursor im Rechteck ist oder nicht..../button pressed or not) Allgemeine Java-Themen 6
K Problem: Java-Klasse mit mehreren Threads als eigenen Prozess starten Allgemeine Java-Themen 3
C Bufferoverflow beim eigenen simpeln Programm Allgemeine Java-Themen 4
F Grundrechenarten mit eigenen Typen Allgemeine Java-Themen 9
D Eigenen Objekt Pool Allgemeine Java-Themen 15
A Eigenen OutputStream schreiben und verwenden Allgemeine Java-Themen 9
D eigenen eventListener Allgemeine Java-Themen 5
X Duplikate aus eigenen Datentypen entfernen Allgemeine Java-Themen 14
H2SO3- jar soll eigenen namen(pfad) finden Allgemeine Java-Themen 12
G Kennt jemand gute Produkte zum Lizensieren der eigenen Apps? Allgemeine Java-Themen 6
G Fragen zum eigenen Scheduler Allgemeine Java-Themen 4
thE_29 Java Prozesse der eigenen JVM Allgemeine Java-Themen 12
Escorter Eigenen Listener schreiben Allgemeine Java-Themen 3
C Eigenen Layout Manager schreiben Allgemeine Java-Themen 7
P Klasse über eigenen Classloader laden: SecurityException Allgemeine Java-Themen 11
M eigenen Desktop erzeugen Allgemeine Java-Themen 3
G hat jeder thread seinen eigenen stacktrace? Allgemeine Java-Themen 2
F Eigenen E-MailClient als Standart definieren Allgemeine Java-Themen 7
F "source not found" in eigenem Projekt mit eigenen Allgemeine Java-Themen 2
G ||| Textdateien aus dem eigenen Projekt lesen. Allgemeine Java-Themen 16
D close Problem bei meinem eigenen ToolTip Allgemeine Java-Themen 2
F Dateien auf dem eigenen Server verändern? Allgemeine Java-Themen 3
M Eigenen Datentyp erstellen Allgemeine Java-Themen 4
N Konsole im eigenen Java-Programm Allgemeine Java-Themen 4
N warning beim compilieren des eigenen TableRenderers Allgemeine Java-Themen 5
G Fenster durch eigenen Button minimieren Allgemeine Java-Themen 6
T Comparator Allgemeine Java-Themen 3
T komplizierter Comparator (IllegalArgumentException) Allgemeine Java-Themen 3
D Comparator Allgemeine Java-Themen 7
S TreeSet - Comparator ändern -> resort? Allgemeine Java-Themen 8
W Comparator oder TreeMap? Allgemeine Java-Themen 10
R Eigener Comparator Allgemeine Java-Themen 2
J Comparator bei Gleichheit zweites Kriterium mitgeben Allgemeine Java-Themen 4
J TreeSet und Comparator will nicht so wie ich Allgemeine Java-Themen 2
V Comparator (steh wohl aufm Schlauch) Allgemeine Java-Themen 12
B Sortierung einer ArrayList mit Comparator Allgemeine Java-Themen 6
Z Probleme mit Comparator für binarySearch Allgemeine Java-Themen 2
S Performance von Comparator Allgemeine Java-Themen 3
T TreeMap durch Comparator mit Generics sortieren Allgemeine Java-Themen 9
N Object-Array mit Comparator absteigend sortieren? Allgemeine Java-Themen 10
S Comparator verwenden? Allgemeine Java-Themen 2
B Per Java Word Dokument schreiben? Allgemeine Java-Themen 8
Calli11 Was muss ich hier in die Main schreiben, damit das Programm ausgeführt wird? Allgemeine Java-Themen 4
_user_q Eingegebenen Text wiederholt schreiben lassen Allgemeine Java-Themen 9
_user_q JavaFX Robot alle Unicode-Zeichen schreiben lassen können Allgemeine Java-Themen 12
curranux Ausgabe als Textdatei schreiben. Allgemeine Java-Themen 2
B Wie kann ich mein 8 Klassen Gebilde objektorientierter schreiben? Allgemeine Java-Themen 114
Y Wie sinnvolle unit tests schreiben Allgemeine Java-Themen 29
O Test schreiben mit Äquivalenzklassen (Aufgabe Prüfung) Allgemeine Java-Themen 9
S Programm schreiben, das mir aufgrund von Schlagwörtern, die ich im Internet suche, relevante Themen sofort anzeigt. Allgemeine Java-Themen 1
H In jar Resources schreiben? Allgemeine Java-Themen 6
O Wie kann ich in Apache POI (Excel Dateien schreiben) Datumszellen in Excel erzeugen Allgemeine Java-Themen 6
Zrebna Wieviele Testfälle muss man hier schreiben? (Software Engineering) Allgemeine Java-Themen 13
B .txt Datei erstellen und auslesen bzw. schreiben Allgemeine Java-Themen 6
S File lesen und schreiben Java 6 Allgemeine Java-Themen 2
L Erste Schritte Ausdruck schöner schreiben? Allgemeine Java-Themen 8
G Excel File öffnen, in Zelle schreiben, abspeichern Allgemeine Java-Themen 6
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
ralfb1105 Blöcke aus Datei filtern/suchen und in neue Datei schreiben Allgemeine Java-Themen 10
D HTTP Http-Link mittels GUI schreiben Allgemeine Java-Themen 5
M In Textdatei schreiben Allgemeine Java-Themen 3
S Input/Output Beste Möglichkeit einen String in einen Datei zu Schreiben Allgemeine Java-Themen 2
Aruetiise " in Datei schreiben Allgemeine Java-Themen 2
D Möglichkeit mit GAE eine Table auszulesen und eine csv zu schreiben Allgemeine Java-Themen 22
K Zusammenfassungen schreiben Allgemeine Java-Themen 2
OnDemand Desktop-Applikation schreiben, wie daten persistent? Allgemeine Java-Themen 9
KeVoZ_ Nacheinander folgende Strings in Textdokument auf neue Zeile schreiben Allgemeine Java-Themen 6
MiMa Log4j in Dateien mit eigenem Namen schreiben Allgemeine Java-Themen 3
A 2D-Grafik Text in ein Bild schreiben Allgemeine Java-Themen 11
M Makrocode von OO in Java schreiben Allgemeine Java-Themen 5
B Animierte Klasse schreiben - Wie? Allgemeine Java-Themen 9
X NetBeans Bilder und andere Dateien ins .jar schreiben und wieder aus .jar lesen Allgemeine Java-Themen 6
D Daten in MySQL-Datenbank schreiben Allgemeine Java-Themen 13
R Signatur von Methoden in eine Datei schreiben? Allgemeine Java-Themen 4
F Fehler in Zeile in Log schreiben Allgemeine Java-Themen 6
F Lesen effizienter als schreiben? Allgemeine Java-Themen 4
H jid3lib nach schreiben keine Tags im Folder angezeigt Allgemeine Java-Themen 1
Z NullPointerException beim Schreiben einer ArrayList in eine Datei Allgemeine Java-Themen 6
B Fortschritt beim Schreiben einer Datei ausgeben lassen Allgemeine Java-Themen 7
F Wert in Variable schreiben, wenn diese gerade genutzt wird Allgemeine Java-Themen 10
U Tiefe Objekte schreiben Allgemeine Java-Themen 1
M Input/Output Datei Schreiben Allgemeine Java-Themen 3
V Eclipse Ich kann bei eclipse nicht schreiben Allgemeine Java-Themen 1
Tobse HTTP REST API's in SQL schreiben Allgemeine Java-Themen 1
B Übergebene Werte in Gerätedatei schreiben Allgemeine Java-Themen 2
2 String Array in Datei schreiben und wieder davon lesen Allgemeine Java-Themen 2
M Methoden jRegistryKey und in die Regitrey schreiben Allgemeine Java-Themen 5
M Text in erstelltes Excelfile schreiben Allgemeine Java-Themen 6
A In Excel-Datei schreiben, Formeln der Mappe anwenden, Wert lesen Allgemeine Java-Themen 3
F Linux & NetBeans: Datei in Systemverzeichnis schreiben? Allgemeine Java-Themen 1
A Input/Output Spätes Schreiben von Dateien der JVM Allgemeine Java-Themen 3
T Input/Output Daten in eine Datei schreiben Allgemeine Java-Themen 4
E wav Datei schreiben mit AudioInputStream Allgemeine Java-Themen 3
T Excel - mit jxf sprachabhängige Formeln schreiben Allgemeine Java-Themen 2
S Java-Programm für "Börsenanalyse" schreiben Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben