Comparator

vikil

Aktives Mitglied
Hallo zusammen,
hab lange gesucht aber irgendwie nichts passendes gefunden.
Ich habe eine TreeMap in dieser lege ich Daten ab(String Objekt). Das sortieren mit compareTo funktioniert.
Ich will aber den Key der TreeMap nach meiner Vorgabe (aus einem Textfeld)sortieren.
Komm nicht dahinter 😕. Habt ihr ein einfaches kleines Beispiel für mich

DANKE

Java:
	TreeMap<String, ZuliEintrag> symboltabelle = new TreeMap<String, ZuliEintrag>();

Java:
public class ZuliEintrag {

		private String symbolik;
		private String adresse;
		private String typ;
		private String komentar;
		private boolean status = false;

		public ZuliEintrag(String symbolik, String adresse, String typ,
				String komentar, boolean status) {
			this.symbolik = symbolik;
			this.adresse = adresse;
			this.typ = typ;
			this.komentar = komentar;
			this.status = status;
		}

		public class SortFilter implements Comparator<ZuliEintrag> {

			public int compare(ZuliEintrag s1, ZuliEintrag s2) {
				// TODO Auto-generated method stub
				return s1.symbolik.compareTo(s2.symbolik);
			}

		}

	}
 
Zuletzt bearbeitet:
Danke erst mal für schnelle Antwort.
Ich will in ein Textfeld was eingeben, und Symbolik soll sich danach sortieren.
1)Wo muss ich den eingelesenen String aus dem TextFeld einbinden. Hab probiert den s2.symbolik durch den TF String zu ersetzen ohne Erfolg.
2)Wo muss ich SortList einbinden weil mit Collection.sort(ZuliEintrag, new SortList()) geht es nicht
 
Ich glaube du stellst dir das anders vor als es funktioniert. Comparator gibt dir die Wertigkeit zweier gleicher Objekte zurück das heißt: welches Objekt ist kleiner als ein anderes.

Damit kann ein Sortieralgorithmus arbeiten er vergleicht die Wertigkeiten untereinander und kann sie dann in eine Ordnung bringen.

Deine Idee ist einen fixen-Knoten mit allen Objekten in deiner Collection zu vergleichen. Das Resultat wird sein, dass es größere und kleinere Objekte in der Collection gibt in bezug auf deinen fixen Knoten. Dies wiederum ist keine Ordnung.

Also wenn du Posten könntest mit einem Papiertest oder einem Beispiel was du erreichen willst, dann kann man dir auch helfen.
 
Also ich was zusammengemalt.
http://www.java-forum.org/attachment.php?attachmentid=6428&stc=1&d=1406715931

Ich glaube auch das ich es mir falsch vorstelle, da ich seit 2 Tagen nichts finden kann.

Was ich vor hab...
Es wir eine Symboltabelle Importiert in eine TreeMap (symboltabelle) .
Laut dem Filter oben im Bild soll diese sortiert werden. Nach der Sortierung ziehe ich mir die Adressen raus (mit symboltabelle.adresse) die übriggeblieben sind nach der Einstellung vom Filter-> Frage den Status dieser Signale von der SPS ab und aktualisiere die Anzeige
 
Wo ist denn das Problem beim Anhang?
Einfach hochladen und das PopUp schließen, der Anhang wird automatisch hinzugefügt

Du musst keine URL extra einfügen 😉
 

Anhänge

Zuletzt bearbeitet:
Achso jetzt sind wir auf der selben Ebene du willst nur bestimmte Objekte aus deiner Collection haben?

Das ist dann was ganz anderes.

Hierzu mal ein kleines Bsp.:

Java:
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import java.util.stream.Collectors;


public class Test {
	
	public static void main(String[] args) {
		new Test();
	}
	public Test() {
		int i = 0;
		String criteria = "criteria1";
		Map<Integer, Node> tm = new TreeMap<>();
		tm.put(i++, new Node("criteria1", "trueValue"));
		tm.put(i++, new Node("criteria1", "trueValue2"));
		tm.put(i++, new Node("criteria2", "falseValue"));
		tm.put(i++, new Node("criteria3", "falseValue"));
		
		//Lambda Expressions
		List<String> lambdaResult = tm.entrySet().stream().filter(e -> e.getValue().key.equals(criteria)).map(e -> e.getValue().value).collect(Collectors.toList());
		printList(lambdaResult);
		
		// < Java 8
		List<String> normalResult = new ArrayList<>();
		for(Entry<Integer, Node> entry : tm.entrySet()) {
			Node node = entry.getValue();
			if(node.key.equals(criteria)) {
				normalResult.add(node.value);
			}
		}
		printList(normalResult);
	}
	
	private <T> void printList(List<T> list) {
		for(T s : list) {
			System.out.println(s);
		}
	}
	
	class Node {
		public String key;
		public String value;
		
		public Node(String key, String value) {
			this.key = key;
			this.value = value;
		}
	}
}
 
gehe davon aus das du den Link öffnen konntest.
will die nur richtig sortiert bekommen haben. ziehe mir die Adressen dann nur z.B von den ersten 20 Einträgen.
Hab so was schon mit schleifen gemacht und geprüft ob der Filtertext in der Symbolik vorkommt und dann angezeigt.
Hab gedacht es geht einfacher mit TreeMaps..
Will es unbedingt mit TreeMaps machen-> Hintergedanke war Symbolik als key hinterlegen damit die Objekte direkt angesprochen und sortiert werden könne. gibt es evtl. alternativen?
Wenn nicht kannst mir vielleicht paar Wörter zu Zeile 23-32 schreiben..
Evtl wonach ich suchen soll..

DANKE
 

Anhänge

  • Sort.jpg
    Sort.jpg
    83 KB · Aufrufe: 34
Zuletzt bearbeitet:
Der Link ist noch immer fehlerhaft.

Verstehe ich dich richtig, dass du in dieser TreeMap schon die gefilterten Objekte hast oder musst du diese filtern?

Nach dem Filtern musst du dann deine Elemente sortieren? Nach welchen Kriterien (wie schon gesagt, man kann nur Objekte untereinander sortieren)?.

Ich mach mich jetzt auf den Weg nach Hause und werde dir dann von dort aus antworten.
 
Zuletzt bearbeitet:
Daten werden in TreeMap importiert und dann immer wieder je nach Benutzer Eingabe sortiert. Sortiert werden soll je nach dem was der Benutzer eingibt, soll zuerst angezeigt werden.
Hab so was schon mit schleifen gemacht und geprüft ob der Filtertext in der Symbolik vorkommt und dann angezeigt.
Hab gedacht es geht einfacher mit TreeMaps..
Will es unbedingt mit TreeMaps machen-> Hintergedanke war Symbolik als key hinterlegen damit die Objekte direkt angesprochen und sortiert werden können. gibt es evtl. alternativen?
Evtl wonach ich suchen soll.. Glaube es geht so gar nicht so wie du geschrieben hast.

Ich gehe jetzt auch heim, melde mich heute Abend..

DANKE
 

Anhänge

  • Sort.jpg
    Sort.jpg
    83 KB · Aufrufe: 26
Zuletzt bearbeitet:
Ja das ist jetzt etwas schwierig eine Filter und eine Sortierfunktion auf einmal zu implementieren. Also ich seh jetzt keine "einfache" Lösung für dein Problem, da es nicht einfach mit dem Comparator funktioniert.

Meine Lösungsansatz wäre die TreeMap nach deinen Vorstellungen zu sortieren. Danach die Objekte holen, die deinen Kriterium entsprechen, die dann als erstes anzeigen lassen, danach die restliche Liste kopieren und die gefilterten Objekte daraus löschen und darunter anzeigen.
 
Wie Flown schon sagte: filtern und sortieren gleichzeitig ist etwas sehr mühsam und du müsstest genau festlegen nach welchen Schema das Ganze funktionieren muss etc.

Was du vielleicht machen könntest:
Liste sortieren (nach Symbolik) und anzeigen (ungefiltert),
bei der Eingabe in das Textfeld sortierst du die Liste nicht neu, sondern scrollst in der JTable einfach zu dem enstprechenden Eintrag

Vorraussetzung: Man kann nur nach Symbolik suchen/filtern, die Liste bleibt geordnet!
 
Meine Lösungsansatz wäre die TreeMap nach deinen Vorstellungen zu sortieren. Danach die Objekte holen, die deinen Kriterium entsprechen, die dann als erstes anzeigen lassen, danach die restliche Liste kopieren und die gefilterten Objekte daraus löschen und darunter anzeigen.

Da filtern in linearer Zeit funktioniert, sortieren aber nur in quasilinearer Zeit, sollte man (fast immer) zuerst filtern und dann sortieren!

(Ich habe nicht den ganzen Thread gelesen, daher hoffe ich, dass mein Kommentar überhaupt zum Problem passt... )
 
Zuletzt bearbeitet:
Danke erst mal an alle.
Bin erst jetzt dazu gekommen zu Antworten.
Mir würde eigentlich das Filter ausreichen. Habe es schon mit Schleifen gemacht-> Wenn Text , der im Filter steht, im TreeMap vorhanden ist, dann anzeigen sonst nicht.
Oder gibt es bessere Möglichkeit es zu machen?

Noch mal danke an alle:applaus::toll:
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben