# Sortieren und Leerzeichen



## Microbit (17. Jan 2013)

Hallo ich habe ein Sortierproblem.
Ich möchte Strings korrekt sortieren und zwar, dass die Leerzeichen immer über "A" stehen, egal was danach kommt. Dieses Verhalten wäre ja auch logisch, denn in der ASCII-Tabelle steht das Leerzeichen auf 32 und A auf 65. Leider spurt der Collator nicht ganz:

```
Schlüterstraße
S Messe-Nord_ICC
Sophie-Charlotten-Straße
```
Nach meinen Wünschen müsste der mittlere Eintrag ganz oben stehen.
Das gleiche Problem tritt auch beim Bindestrich auf. Die sollen mal ASCII lernen.
Die Vergleichsmethode:

```
public int compareTo(Haltestelle compareObject) {
    Collator collator = Collator.getInstance(Locale.GERMAN);
    collator.setStrength(Collator.SECONDARY);
    return collator.compare(getName(), compareObject.getName()); }
```


----------



## nillehammer (17. Jan 2013)

Unabhänig davon, ob man SPACES vor oder nach Buchstaben einsortieren würde. Sie irgendwo zwischen c und o einzusortieren, ist ja nun wirklich Käse. Ich kann mir nicht vorstellen, dass das compare des Collators so implementiert ist. Ich würde den Fehler also in dem Code vermuten, der die Sortierung vornimmt. Hast du den evtl. selbst geschrieben? Gibt ja sonst sowas wie Collections.sort oder SortedSet.


----------



## Timothy Truckle (17. Jan 2013)

Microbit hat gesagt.:


> Hallo ich habe ein Sortierproblem.
> Ich möchte Strings korrekt sortieren und zwar, dass die Leerzeichen immer über "A" stehen, egal was danach kommt. Dieses Verhalten wäre ja auch logisch, denn in der ASCII-Tabelle steht das Leerzeichen auf 32 und A auf 65. Leider spurt der Collator nicht ganz:


Dass könnte daran liegen, dass der Collator genau dass machen soll.

Spiel doch mal mit 
	
	
	
	





```
setStrength()
```
 rum, ist in der API beschrieben.

bye
TT


----------



## Microbit (17. Jan 2013)

> Unabhänig davon, ob man SPACES vor oder nach Buchstaben einsortieren würde. Sie irgendwo zwischen c und o einzusortieren, ist ja nun wirklich Käse.


Ich befürchte das liegt daran dass der die Leerzeichen intern westreicht und das m benutzt. Ich hatte auch schon probiert die Leerzeichen durch Tiefstriche zu ersetzen, aber die werden auch nicht pfleglicher behandelt.


> Gibt ja sonst sowas wie Collections.sort oder SortedSet.


Ich verwende ja schon [c]Collections.sort()[/c].


> Spiel doch mal mit setStrength() rum, ist in der API beschrieben.


Leider erfolglos.


----------



## nillehammer (17. Jan 2013)

Microbit hat gesagt.:
			
		

> Ich befürchte das liegt daran dass der die Leerzeichen intern westreicht und das m benutzt. Ich hatte auch schon probiert die Leerzeichen durch Tiefstriche zu ersetzen, aber die werden auch nicht pfleglicher behandelt.


Habe mir gerade den Source-Code der Collator-Implementierung im JDK angeschaut. Das ist ein gutes Beispiel für Code, den man besser so nicht schreibt. Ich habe die Funktionsweise deswegen nicht vollständig verstanden. Aber es gibt dort tatsächlich sowas wie ein Skip von Zeichen unter bestimmten Bedingungen. Deswegen ist Deine Befürchtung durchaus wahrscheinlich. Dann liegt es wohl doch am Collator. Sorry, dass ich an Dir gezweifelt habe opcorn:

Da du mit strength schon rumgespielt hast und es nichts gebracht hat, die Frage: Bringt ein "normales" String.compareTo()" Dich nicht vielleicht ans Ziel? Also einfach:

```
public int compareTo(Haltestelle compareObject) {
   return this.name.compareTo(compareObject.name);
}
```


----------



## Microbit (17. Jan 2013)

Dies hilft nichts. Es scheint so als wäre diese "Funktion"/nervige Klicki-Bunti-Programmier"hilfe" fix im Code, da ist es egal ob mit oder ohne Collator. Wo genau steht denn nun der eigentliche Code zum sortieren? Ich hab mich in Netbeans schon durchgeklickt aber das sind alles nur Interfaces.


----------



## nillehammer (17. Jan 2013)

> Wo genau steht denn nun der eigentliche Code zum sortieren? Ich hab mich in Netbeans schon durchgeklickt aber das sind alles nur Interfaces.


Zunächst einführend (ist vielleicht auch schon ein Selbstgänger): Für eine Sortierreihenfolge braucht man ja erstmal eine Idee, wann etwas größer/kleiner/gleich ist. Das macht die compareTo-Methode. Diese wird von den Algorithmen verwendet, um bei Vergleich zweier Elemente diese Entscheidung zutreffen.

Und zur Frage: Die Sortierung wird in Collections.sort gemacht. Punkt. Du kannst Dich darauf verlassen, dass es funktioniert. Und brauchst da nicht weiter nachzuforschen. Aber wenn Du es wissen willst: Die Klasse Collections bedient sich der Klasse Arrays. Dort sind die Algorithmen (z.B. merge-Sort) implementiert.



> Dies hilft nichts. Es scheint so als wäre diese "Funktion"/nervige Klicki-Bunti-Programmier"hilfe" fix im Code, da ist es egal ob mit oder ohne Collator.


Da verstehe ich nicht mal ansatzweise, was Du damit meinst. Wo steht da was fix in welchem Code? Ich dachte, den schreibst du gerade?


----------



## Microbit (17. Jan 2013)

> Da verstehe ich nicht mal ansatzweise, was Du damit meinst. Wo steht da was fix in welchem Code? Ich dachte, den schreibst du gerade?


Vergiss es, kleiner Denkfehler von mir.

Was ich aber nicht verstehe ist, warum String in seiner compareTo Methode nichts über mögliche Auslassung von Zeichen stehen hat, aber es trotzdem nicht funktioniert, auch nicht mit deiner vorgeschlagenen Methode.

Ich probier jetzt mal, wenn " S " in einem der beiden Strings drin ist, dass dann auf jeden Fall dieses höher steht.


----------



## nillehammer (17. Jan 2013)

Folgender Code zum Test der natürlichen Sortierreihenfolge von Strings, also mittels Aufruf von compareTo() während der Sortierung:

```
public static void main(String[] args) {

  // Array ist falsch Sortiert, Leerzeichen steht in der Mitte
  String[] strArr = { "Schlüterstraße", "S Messe-Nord_ICC", "Sophie-Charlotten-Straße" };
  // Falsch sortiertes Array ausgeben
  System.out.println(Arrays.toString(strArr));
  // Sortieren (intern wird compareTo() von String verwendet)
  Arrays.sort(strArr);
  // Sortiertes Array ausgeben
  System.out.println(Arrays.toString(strArr));
}
```
Ausgabe:

```
[Schlüterstraße, S Messe-Nord_ICC, Sophie-Charlotten-Straße]
[S Messe-Nord_ICC, Schlüterstraße, Sophie-Charlotten-Straße]
```
Leerzeichen werden also vor's Alphabet einsortiert. Sie werden *nicht* ausgelassen. Das ist doch genau, was Du wolltest? Das gleiche funktioniert auch mit einer List<String>.


----------



## Timothy Truckle (18. Jan 2013)

Microbit hat gesagt.:


> Nach meinen Wünschen müsste der mittlere Eintrag ganz oben stehen.
> Das gleiche Problem tritt auch beim Bindestrich auf. Die sollen mal ASCII lernen.
> Die Vergleichsmethode:
> 
> ...


Und noch mal ein Blick in die API eröffnet dies:





			
				Collator hat gesagt.:
			
		

> Collator is an abstract base class. Subclasses implement specific collation strategies. One subclass, RuleBasedCollator, is currently provided with the Java Platform and is applicable to a wide set of languages. Other subclasses may be created to handle more specialized needs.
> 
> Like other locale-sensitive classes, you can use the static factory method, getInstance, to obtain the appropriate Collator object for a given locale. You will only need to look at the subclasses of Collator if you need to understand the details of a particular collation strategy or if you need to modify that strategy.





			
				RuleBasedCollator hat gesagt.:
			
		

> *Ignorable Characters*
> For ignorable characters, the first rule must start with a relation (the examples we have used above are really fragments; "a < b" really should be "< a < b"). If, however, the first relation is not "<", then all the all text-arguments up to the first "<" are ignorable. For example, ", - < a < b" makes "-" an ignorable character, as we saw earlier in the word "black-birds". In the samples for different languages, you see that most accents are ignorable.


Man muss den [JAPI]RuleBasedCollator[/JAPI] also nur richtig configurieren...

bye
TT


----------



## mla.rue (18. Jan 2013)

Hab mich beim lesen des ersten Beitrags schon gefragt, wieso nicht Arrays.sort benutzt wird, Collator.. .das ist wie mit Kanonen auf Spatzen schießen.

Immer dieser nillehammer, immer wenn man als Anfänger was anbringen kann, kommt der nillehammer einem zuvor . Ich mag dich nicht, HUE 
/sarcasm off


----------



## nillehammer (18. Jan 2013)

Spoiler: Antwort auf mla.rue's Post



[OT]





			
				mla.rue hat gesagt.:
			
		

> Immer dieser nillehammer, immer wenn man als Anfänger was anbringen kann, kommt der nillehammer einem zuvor . Ich mag dich nicht, HUE
> /sarcasm off


Ganz frisch bist Du ja auch nicht mehr (Registriert seit: 22.09.2011) ueh:[/OT]


----------

