# Wörter in umgekehrter Reihe sortieren



## Razorhawk (29. Januar 2005)

Ich habe hier eine Aufgabe, die ich lösen muss, aber ich habe gerade keinen Schimmer was sie von mir wollen oder besser auf welche Art ich das programmieren soll.

Ich hoffe es kann mir jemand helfen:

#############################


Definieren Sie eine Klasse InverseComparator, mit deren Hilfe im folgenden Programm die
Argumente in umgekehrter lexikographischer Reihenfolge ausgegeben werden:

```
class InterfaceDemo{

public static void main(String args[]){

          java.util.Arrays.sort(args, new InverseComparator());
          for (int i = 0; i < args.length; i++)
                     System.out.println(args[i]);
          }
}

}
```


----------



## wasted time (29. Januar 2005)

Hmm, hab lange nicht mehr mit Java programmiert,  deswegen kann ich dir nur raten, das hier mal im Java-Forum zu posten.  
Oder guck in deiner Java-Referenz nach "Comparatoren" und wie man davon Klassen ableiten kann. Der Algorithmus dürfte ja nicht das Prob sein.


----------



## Navy (29. Januar 2005)

Mhmm... Drück mal F1 und guck was Max dazu sagt 

Aber mal im Ernst:

Für mich als Java unkundigen, aber des Programmierens doch mächtig, scheinst Du ein Argument eines beliebigen Datentyps reinzubekommen (höchstwahrscheinlich string) und diesen dann Schritt für Schritt auszugeben. Das Argument sollst Du nach den den von Dir bekommenen Bedingungen in einer Klasse umstellen lassen, so das die Bedingung der "lexikographischen" Reihenfolge stimmt.

HTH

  Navy


----------



## wasted time (29. Januar 2005)

So ungefähr, wenn man ein Programm mit der guten alten Konsole startet, kann man Parameter übergeben z.B. 3dmax.exe -?. Die werden bei einem Java-Programm im Parameter "args" (Array von Strings) der "main"-Methode gespeichert. Diesen Array und eine Instanz der Klasse "InverseComparator" wird der Methode  "java.util.Arrays.sort" übergeben. Danach sind die Wörter in "args" in umgekehrter lexikographischer Reihenfolge und werden mit
	
	
	



```
for (int i = 0; i < args.length; i++) System.out.println(args[i]);
```
 am Bildschirm ausgegeben.
Soweit zur Aufgabenstellung. Wie das jetzt mit der Klasse "InverseComperator" im Zusammenhang mit dem Methodenaufruf von "java.util.Arrays.sort" genau funktioniert, kann man dir sicher im Java-Forum sagen.


----------



## Razorhawk (30. Januar 2005)

Kann mir einer sagen, warum ich das ins 3dmax forum gepostet habe? 

Das sollte eigentlich ins Javaforum... muss mich wohl mächtig vertan haben.
Kann das mal ein Moderator verschieben danke! 

Trotzdem danke für die Antworten! Auch wenn die Frage hier absolut nicht reinpasst 
Aber mir geht es eher darum, was die Klasse mit dem Array sort Befehl zu tun hat... wie ich damit umgehen soll.
Was der Algorithmus von mir verlangt im allgemeinen ist wirklich nicht schwer zu erkennen


----------



## wasted time (30. Januar 2005)

> Kann mir einer sagen, warum ich das ins 3dmax forum gepostet habe?


  Macht der Gewohnheit!

Die Klasse soll angeben, wie die Wörter geordnet werden. Sie muss abgeleitet werden von der Klasse/Schnittstelle "Comparator", die oft eingesetzt wird, wenn man variable Vergleichsmöglichkeiten bieten will, wie eben bei der Sort-Methode. Du musst 2 Methoden definieren:

```
int compare(Object o1, Object o2)
   - ist neg, wenn o1 kleiner als o2 ist
     ist 0, wenn beide gleich sind
     ist pos, wenn o1 größer als o2 ist

boolean equals(Object obj)
  - Zeigt an, ob das Objekt obj mit diesem Comparator äquivalent ist.
```

Bei der 2. musst du noch ein bissel was beachten, guck dazu am besten mal in ne Java Referenz.

mfg wasted time


----------



## Navy (30. Januar 2005)

> Aber mir geht es eher darum, was die Klasse mit dem Array sort Befehl zu tun hat... wie
> ich damit umgehen soll.
> Was der Algorithmus von mir verlangt im allgemeinen ist wirklich nicht schwer zu erkennen 

Du kannst einen string auch als array von character ansehen. Das bringt dir 2 Vorteile: 
- Du hast Indizes für den direkten Positionszugriff und mußt nicht lange suchen
- Du kannst für 2 Symbole in einem definiert sortierten Universum recht einfach ein 
Relationszeichen setzen ohne parsen zu müssen

Für array eignet sich eigentlich immer Quicksort (sofern Rekursion nicht unerwünscht ist)

  Navy


----------



## cham (30. Januar 2005)

Schau mal da:

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html#compareTo(java.lang.String)

In Deinem Comparator musst Du dieses Ergebnis dann einfach mit -1 multiplizieren und dann beim sortieren angeben.


----------



## Razorhawk (31. Januar 2005)

Danke für die Antworten, aber ich versteh noch nicht ganz wie die Klasse InversComparator mit dem String args kommuniezieren soll, wenn gar kein String übergeben wird an diese Klasse.
Ich muss doch in dieser Klasse mindestens einen String haben um vergleiche ausführen zu können.
Wie hängt das zusammen? InversComparator soll ja schließlich keine Eingabeparameter haben.

Muss ich die Methoden rekursiv definieren?
Muss ich dazu Listen verwenden oder ist es anders günstiger?


----------



## cham (31. Januar 2005)

Der Comparator definiert nur wie sich die Objekte (in dem Fall Strings) zueinander verhalten. Also wann sind Objekte gleich, größer oder kleiner. Damit ist also nur das Sortierkriterium definiert. 

Sortiert werden die Strings dann zum Beispiel durch Array.sort  - http://java.sun.com/j2se/1.5.0/docs/api/java/util/Arrays.html#sort(T[],%20java.util.Comparator)

Das gleiche geht auch mit z.Bsp. Collections.


----------



## Razorhawk (31. Januar 2005)

okay habs ein bisschen weiter begriffen, aber wie sollte ich in meiner Klasse compareTo benutzen, wenn ich keine Strings habe die ich miteinander vergleiche.
Muss ich da irgendwelche Objekte vergleichen? (hab ich aber doch auch keine Übergeben... oder?


----------



## seppltrallala (31. Januar 2005)

Erst mal ganz von vorne und eine Zusammenfassung von dem was die Anderen schon gesagt haben : 

1. Java API Documentation runterladen, und am besten mal schauen was die statische Methode  Arrays.sort(Object[], Comparator) macht, denn die wird ja aufgerufen.

2. Verstehen das dein übergebener erster Parameter args[] ein Array von Strings aus allen der main methode übergebenen Parametern ist, wenn du z.B. in deiner Kommandozeile eingibst : 
_java meinTollesProgramm Sepp Hugo Otto _
hast du in args[] {"Sepp","Hugo","Otto"} stehen, wenn du keine Parameter übergibst, ist das Array natürlich leer, (und ein leeres Array sieht sortiert genauso aus wie unsortiert) !

3. Deine Klasse InverseComparator muss das Interface Comparator implementieren, und dabei die Methoden compare() und equals() implementieren. Auch hier am besten Mal in der Java API Reference nachschauen.
In deinem InverseComparator musst du compare() halt so schreiben das er zwei Strings in entgegengesetzter alphabetischer Reihenfolge sortiert, die  equals() Methode lässt du am Besten einfach weg ( dann wird die von java.lang.Object genommen)

4. Jetzt verstehen das dein Beispielprogramm die statische Methode _Arrays.sort(Object[], Comparator)_ aufruft, dabei als Übergabeparameter deine Kommandozeilenparameter als Array hat, und in der sort() Methode dieses Array nach den Vorschriften in deiner compare() Methode sortiert wird.


Hoffe das dir jetzt klar ist was du tun sollst


----------



## Razorhawk (31. Januar 2005)

Nachdem ich in der Uni noch eine ganze Weile drüber gebrütet habe und das hier nochmal gelesen habe, merke ich, dass ich heute schon ruasgefunden habe, was ich machen muss, aber wahrscheinlich mich nur damit befassen muss, damit ich weiß wie das ganze programmiert aussieht.


----------



## schnuffie (3. Februar 2005)

hmm, ich würde die Sache so angehen:


```
String[] as = {"Heinz", "Max", "Emil", "Jonas"};
Arrays.sort(as, new MyComparator());
for (int i = 0; i < as.length; i++) {
System.out.println(i + "=" + as[i]);
}
 
private class MyComparator implements Comparator {
public int compare(Object o1, Object o2) {
	return o2.toString().compareTo(o1.toString()); //invers
}
}
```


----------



## torsch2711 (3. Februar 2005)

Ich glaube zu schnuffies code beispiel, kann ich nix mehr hinzufügen. Es erschlägt schon deine bedürfnisse 

Nice work Schnuffie!


Hier hast du einen Link zu dem Interface Comparator:
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Comparator.html

Und hier noch zu der Klasse String:

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html

für die compareTo methode 

um das beispiel besser nachvollziehen zu können.

Ich hoffe du weisst was ein Interface ist und wofür es gut ist, ansonsten google mal danach! 


Gruss 

Torsten


----------



## takidoso (3. Februar 2005)

schnuffie hat gesagt.:
			
		

> hmm, ich würde die Sache so angehen:
> 
> 
> ```
> ...



Halli hallo also ich würde das ganze mit einem Collator-Object machen, damit ich, was die Sortierung angeht, auch National-Language-Support bekomme (man achte auf Umlaute etc. denn sonst würden Worte mit z.B.  Ö nicht derekt nach OE sortiert sondern ans Endes des Alfabets gesetzt)

Deine Comperator-Klasse sollte also lediglich als Membervariable den Collator haben den du aus dem Package java.text.* holen kannst.
als kleines Bonus ist es vielleicht gut, Groß und Kleinschreibung dabei außer Acht zu lassen das kann man entweder mit einem toLowerCase() oder einem toUpperCase() bewerkstelligen.

protected Collator         m_collator           = Collator.getInstance();

in deiner  compare-Routine lässt Du einfach dann den Collator vergleichen . Also müsste das ganze ungefär wie folgt aussehen:


```
...
import java.text.*
...

String[] as = {"Heinz", "Max", "Emil", "Jonas", "Österreich", "Ärger", "Anna", "Otto", "Zebra"};
Arrays.sort(as, new MyComparator());
for (int i = 0; i < as.length; i++) 
{
    System.out.println(i + "=" + as[i]);
}
 
private class MyComparator implements Comparator 
{
   private Collator    collator  = Collator.getInstance();  // richtet sich nach dem DefaultLocale
   public int compare(Object o1, Object o2) 
   {
      String s1 = o1.toString().toLowerCase();
      String s2 = o2.toString().toLowerCase();
      return collator.compare(s2,s1);
   }
}
```

Du kannst gerne das ganze mit dem einen oder dem anderen Comperator ausprobieren und die Unterschiede erkennen 

viel Spaß

Takidoso


----------



## torsch2711 (3. Februar 2005)

Hi Takidoso,

man lernt doch nie aus. Wusste gar nicht das es so eine klasse in java existiert. Sollte mich mal wieder etwas mehr mit den ganzen libraries beschäftigen 

Aber wofür bin ich denn sonst auf tutorials.de angemeldet 


Danke für die Informationen.

Gruss 

Torsten


EDIT:*ichsolltevielleichtauchdennamenvondirrichtigschreiben*


----------

