OOP Logikhilfe zum Comparator

Basti4231

Bekanntes Mitglied
Hey Leute,

ich habe mir einen Comparator gebastelt, der eine Liste von Programmnamen vergleicht. Die sehen wie folgt aus:

P5001
P5002
P5003
U5032
U5033
usw.

Ich sortiere diese Programmnamen, sie befinden sich in einer ArrayList.
Die Ausgabe nach meiner Logik ist erst alles mit P und dann alles mit U, auch logisch.

Mein Vergleich ist nämlich nur so :

Java:
public int compare(String s1, String s2) {

               return s1.compareTo(s2);
    }

Diese Programme mit U sind Unterprogramme von P5003, ich muss es jetzt hinkriegen, dass die U-Programme genau nach dem P5003 in der Liste auftauchen, die ich dann in Excel schreibe.

Mir fällt nämlich gerade nicht ein, wie ich dies logisch darstellen kann, aber ich bin noch am überlegen.^^

Vielleicht könnt ihr mir ja dabei helfen 😉

lg basti
 
Zuletzt bearbeitet:
Hi,

Du könntest zunächst den hinteren Teil des Namens vergleichen und am Ende den Buchstaben am Anfang.
Vorausetzung ist das die Zahlenfolge eindeutig ist.

Beispiel:
Java:
	// Beispiel: P5001
	// Beispiel: U5001
	public int compare(String s1, String s2) {
		
		// temp1 = 5001
		// temp2 = 5001
		String temp1 = s1.substring(1);
		String temp2 = s2.substring(1);
		
		int vergleich = temp1.compareTo(temp2);
		
		// Teilstrings sind nicht gleich
		if(vergleich != 0) {
			return vergleich;
		}
		
		// Teilstring sind gleich, dann kompletten String vergleichen
		return s1.compareTo(s2);
	}

Vielleicht hilft Dir das weiter.

Viele Grüße
twagi
 
Wie sieht das denn aus, wenn ich es nicht jetzt mit festen Werten mache?

Ich hätte auch noch eine andere Idee. Wenn ich beim Einlesen der Programmnamen die P schon von den U trenne und U in einer expliziten ArrayList habe und diese dann sortiere, könnte ich bei der compare Methode ein
Java:
if (s1.equals("P5003")){
   //hier dann die sortierte Liste mit U einfügen
}
return s1.compareTo(s2);

einbauen.

Aber ich weiß nicht, ob das so sinnvoll ist^^
und müsste ich vielleicht dann nicht noch ein oder s2.equals("P5003") einbauen?
???:L
 
Bin mir nicht ganz sicher, ob ich dich richtig verstanden habe, aber sollte dem so ein würde ich mir wahrscheinlich eine abstrakte Klasse Programm schreiben mit einer getName()-Methode und einem Getter/Setter für einen int "nummer". Dann folgen zwei implementierende Klassen Hauptprogramm und Unterprogramm. Hauptprogramm besitzt eine Collection von Unterprogrammen. Beide Klassen implementieren Comparable und können dann ausschließlich anhand ihrer Nummer untereinander verglichen werden (da sie ja offensichtlich immer den gleichen Buchstaben haben).

Beim Einlesen der Programmnamen unterteilst du dann einfach: wenn ein P vorne steht, wird dies ein Hauptprogramm, wenn ein U vorne steht, erzeugst du ein Untergramm und fügst das Objekt in die Collection vom letzten Hauptprogramm. Die Hauptprogramme packst du dann in eine eigene Collection.

Beim Erzeugen der Programme trennst du die Nummer aus dem Namen heraus (= int nummer ). In der getName Methode gibst du dann einfach den Buchstaben + Nummer wieder zurück.

Beim Auslesen der Hauptprogrammcollection fragst du dann einfach immer ab, ob das Hauptprogramm noch Unterprogramme hat.
 
Zuletzt bearbeitet:
Hey Leute,

ich habe mir einen Comparator gebastelt, der eine Liste von Programmnamen vergleicht. Die sehen wie folgt aus:

P5001
P5002
P5003
U5032
U5033
usw.



Diese Programme mit U sind Unterprogramme von P5003,...

Woher soll man wissen, bzw. gibt es irgendeine allgemeingültige Logik, das U5032 Unterprogramm von P5001 ist, oder warum ist U5032 nicht Unterprogramm von P5003?
 
Sieh zuerst nach, ob beide Strings von der gleichen Art (= der erste Buchstabe) sind:
  • Wenn ja: Vergleiche die Nummern
  • Wenn nein: Vergleiche die Arten
 
...Diese Programme mit U sind Unterprogramme von P5003, ich muss es jetzt hinkriegen, dass die U-Programme genau nach dem P5003 in der Liste auftauchen, die ich dann in Excel schreibe.

Mir fällt nämlich gerade nicht ein, wie ich dies logisch darstellen kann, aber ich bin noch am überlegen.^^

@ Suinos
deine Anweisungen würden eine nach "Arten" und nach Nummern sortierte "Liste" geben, und nicht das von Basti gewünschte Ergebnis!

Meine Frage bleibt:
Woher soll man wissen, bzw. gibt es irgendeine allgemeingültige Logik, das U5032 Unterprogramm von P5001 ist, oder warum ist U5032 nicht Unterprogramm von P5003?
 
P5003 ist das Mutterprogramm. Nur es selber hat eigene Unterprogramme, für die anderen wäre es irrelevant. Es ist ebenfalls möglich, dass noch mehr als nur 2 Unterprogramme (aktueller Stand) hinzukommen.

gruß basti
 
Die Frage bleibt bestehen:

Kannst du an den Strings selber sehen, welches Unterprogramm zu welchem Programm gehört (aufgrund der Nummer oder so), oder geht das nicht / ist das nicht vorgesehen, da sowie so nur ein Programm Unterprogramme hat?

Falls man es erkennen kann, kann man eine generelle Lösung einbauen, welche auch weiterhin funktioniert, falls doch mal weitere Unterprogramme kommen.

Ansonsten wird eben eine Extrawurst für
Code:
P5003
gebraten. 😉
 
Das hier für zumindest mal nach meiner Vorstellung zum richtigen Ergebnis.
Aber das ist natürlich nicht wirklich schön, da du z.B. P5003 fest reinkodierst
Java:
public int compare(String arg0, String arg1) {
	if (arg0.equals(arg1)) {
		return 0;
	}
	if (arg0.charAt(0)=='U') {
		if (arg1.charAt(0)=='U') {
			return (arg0.substring(1).compareTo(arg1.substring(1)));
		} else {
			int number = Integer.valueOf(arg1.substring(1));
			if (number<=5003) {
				return 1;
			} else {
				return -1;
			}
		}
	} else {
		if (arg1.charAt(0)=='U') {
			int number = Integer.valueOf(arg0.substring(1));
			if (number<=5003) {
				return -1;
			} else {
				return 1;
			}
		} else {
			return (arg0.compareTo(arg1));
		}
	}
}
 
Boah vielen Dank, so geht es 😀

Jetz passt meine Liste und ich muss nur noch Excel schreiben, wobei es da auch Schwierigkeiten gibt, aber ich hoffe, sie beheben zu können 🙂

Merci beaucoup und das fixe Kodieren mit P5003 ist nicht schlimm, denn es ist so unlogisch, dass andere Programme außer 5003 Unterprogramme haben, als ob es in der Kirche kein Amen mehr gibt.
 

Neue Themen


Zurück
Oben