# Strings vergleichen & sortieren



## Hannek92 (4. Aug 2015)

Momentan bin ich an einem Programm dran, das einen String einließt und danach die Wörter in alphabetischer Reihenfolge ausgeben soll und sagen soll, wie oft das einzelne Wort vor kam.
Also z.B. soll hallo ich hallo als Ausgabe hallo: 2 , ich : 1 haben.

ich dachte, das ich als erstes die Wörter wohl in ein String Array packe. Danach wollte ich schauen, wie oft ein bestimmtes Wort vorhanden ist. Mein Problem ist, dass ich das String array auch noch sortieren muss, denn momentan kriege ich als Ausgabe hallo: , ich : 1, hallo:1 ..

Wie kann ich denn jetzt das String Array sortieren ? Ich habe gegoogelt, dass es die Methode Arrays.sort gibt, aber die dürfen wir nicht benutzen :/
Soweit sieht mein Code aus, habt ihr Vorschläge für die Sort Methode ?


```
public class Stringent{
    public static void devide(String s) {
        String [] wort = s.split(" ");
        int count = 1;
     
        String wortJetzt = wort[0];
        for (int i = 1; i < s.length(); i++ ) {
         
                if ( wort[i].equals(wortJetzt)) {
                    count++;
                } else {
                    System.out.println(wort[i] +" "+ " : " + count + "\n");
                    wortJetzt = wort[i];
                    count = 1;
                }
         
         
        }   System.out.println(wortJetzt+" kommt "+count+" mal vor.");
    }

 
 
    public static void main (String[] args) {
        Scanner scan = new Scanner(System.in);
        String st = scan.nextLine();
        devide(st);
    }
}
```


----------



## javampir (4. Aug 2015)

hi,
schau dir mal die methode anystring.compareTo(anotherString) an


----------



## Hannek92 (4. Aug 2015)

meinst du dann so ? 

```
public static void sort ( String []  str) {
       
    for( int i = 1; i < str.length-1; i++) {
        for( int j = 0; j < str.length; i++) {
            int compare= str[i].compareTo(str[j]);
           
            if ( compare > 0) {
                String temp = str[i];
                str[i] = str[j];
                str[j] = str[i];
            }
        }
    }
}
```

kriege da jetzt arrayindexoutofbounds :/


----------



## javampir (4. Aug 2015)

hast in der zweiten for-schleife nen tipper, muss j++ sein
hab mir die logik aber ansonsten jezt nicht angeschaut


----------



## Hannek92 (4. Aug 2015)

oh ja stimmt.. danke  ändert aber leider nichts an meiner ausgabe :/ 

meine beiden Methoden sehen so aus.. siehst du zufällig, wo mein fehler ist? 

```
public static void devide(String s) {
        String [] wort = s.split(" ");
        sort(wort);
        int count = 1;
       
        String wortJetzt = wort[0];
        for (int i = 1; i < s.length(); i++ ) {
           
                if ( wort[i].equals(wortJetzt)) {
                    count++;
                } else {
                    System.out.println(wort[i] +" "+ " : " + count + "\n");
                    wortJetzt = wort[i];
                    count = 1;
                }
           
           
        }   System.out.println(wortJetzt+" kommt "+count+" mal vor.");
    }
   
public static void sort ( String []  str) {
       
    for( int i = 1; i < str.length-1; i++) {
        for( int j = 0; j < str.length; j++) {
            int compare= str[i].compareTo(str[j]);
           
            if ( compare > 0) {
                String temp = str[i];
                str[i] = str[j];
                str[j] = str[i];
            }
        }
    }
}
```


----------



## javampir (4. Aug 2015)

am besten sagst du die zeile, wo deine arrayindexoutofboundsexception ist.
außerdem sieht das am ende von sort nach einem nicht gelungenen ringtausch aus, bist du sicher, dass die letzte zeile nicht str[j] = temp heißen muss?


----------



## Hannek92 (4. Aug 2015)

ja, du hast vollkommen recht.. muss wohl langsam eine pause vom lernen machen :/ will das hier nur noch hinkriege... die Exceptions habe ich im code mit hier markiert


```
import java.util.Scanner;
import java.util.Arrays;
public class Stringent{
    public static void devide(String s) {
        String [] wort = s.split(" ");
        sort(wort);
        int count = 1;
      
        String wortJetzt = wort[0];
        for (int i = 1; i < s.length(); i++ ) {
          
                if ( wort[i].equals(wortJetzt)) { // HIER
                    count++;
                } else {
                    System.out.println(wort[i] +" "+ " : " + count + "\n");
                    wortJetzt = wort[i];
                    count = 1;
                }
          
          
        }   System.out.println(wortJetzt+" kommt "+count+" mal vor.");
    }
  
public static void sort ( String []  str) {
      
    for( int i = 1; i < str.length-1; i++) {
        for( int j = 0; j < str.length; j++) {
            int compare= str[i].compareTo(str[j]);
          
            if ( compare > 0) {
                String temp = str[i];
                str[i] = str[j];
                str[j] = temp;
            }
        }
    }
}

    public static void main (String[] args) {
        Scanner scan = new Scanner(System.in);
        String st = scan.nextLine();
        devide(st); // HIER
    }
}
```


----------



## javampir (4. Aug 2015)

muss kurz vor dem oberen hier

```
for(int i = 0; i < str.length() - 1; i++) {
```
sein


----------



## JStein52 (4. Aug 2015)

In deinem sort ist auf jeden Fall ein Fehler. Aus diesem String-Array:
Hallo Halli und Tschuess

macht der sort dieses:

Hallo Halli Halli Tschuess

Überdenke den sort nochmal


----------



## JStein52 (4. Aug 2015)

Und du meintest in der einen Schleife sicher nicht "for (int i = 1; i < s.length(); i++ ) {"
sondern for (int i = 1; i < wort.length; i++ ) {


----------



## Hannek92 (4. Aug 2015)

den fehler mit wort.length, den habe ich gerade auch gefunden und schon behoben..  jetzt muss ich nur gucken, was an der sort-methode nicht richtig läuft


----------



## black swan (4. Aug 2015)

Ich glaube, dass Du in Zeile 10 den falschen Zähler verwendest: Du möchtest doch über alle Wörter gehen und nicht über alle Zeichen, oder?

```
s.length() // liefert Anzahl der Zeichen, nicht Anzahl der Wörter
```

Update: Uuups, zu langsam! ;-)


----------



## JStein52 (4. Aug 2015)

Kleine Hilfe, schau dir mal das an:

INSERTIONSORT(A)
1 *for* k ← 2 *to* Länge(A) *do*
2 ....einzusortierender_wert ← A[k]
3 ....j ← k
4 *....while* j > 1 *and* A[j-1] > einzusortierender_wert *do*
5 ........A[j] ← A[j - 1]
6 ........j ← j − 1
7 ....A[j] ← einzusortierender_wert

Wobei bei diesem Pseudocode die Nummerierung der Elemente in A bei 1 beginnt !!!

Edit: Einrückungen wäre noch gut


----------



## Hannek92 (4. Aug 2015)

meinst du das so? also ich hab das jetzt mit zwei for schleifen gemacht.. aber sollte ja das gleiche machen, außer ich hab deinen pseudocode jetzt falsch verstanden ..

_


		Java:In die Zwischenablage kopieren


public static void sort ( String []  str) {
     
    for( int i = 1; i < str.length; i++) {
        for( int j = i; j > 0 ; j--) {
            int compare= str[j].compareTo(str);
         
            if ( compare > 0) {
                String temp = str[j];
                str[j] = str[j-1];
                str[j-1] = temp;
            }
        }
    }
}


also bei einer ausgabe von ich auch ich .. wird als erstes  auch ausgegeben und dann ich.. nur das ich wird nur einfach ausgegeben.._


----------



## Hannek92 (4. Aug 2015)

ah ne funktioniert doch nicht...  ich glaub ich muss einfach kurz ne pause machen und schau mir das gleich noch mal an, bevor ich euch noch mit mir quälen müsst


----------



## JStein52 (4. Aug 2015)

Nein, so:


```
public static void sort ( String []  str) {
     
    for( int i = 1; i < str.length; i++) {
        String temp = str[i];
        int j = i;
        while( j > 0 && (str[j-1].compareTo(temp)) > 0) {
                str[j] = str[j-1];
                j = j-1;
        }
        str[j] = temp;
    }
}
```

Sorry, ich hatte vorhin Schwierigkeiten mit den Einrückungen

Edit:  nur Mut, das kriegst du heute noch !


----------



## JStein52 (4. Aug 2015)

Übrigens, ich glaube deines wäre auch beinahe gegangen. Sollte es nicht so aussehen:


```
public static void sort ( String []  str) {
   
    for( int i = 1; i < str.length; i++) {
        String temp = str[i];
        int j;
        for(j = i; j > 0 ; j--) {
            int compare= str[j-1].compareTo(temp);
       
            if ( compare > 0) {
                str[j] = str[j-1];
            } else {
                 break;
            }
        }
        str[j] = temp;
    }
}
```

Aber Achtung:  ich habe diese Version nicht getestet, nur meine von vorhin. Überlasse ich dir


----------



## Hannek92 (4. Aug 2015)

kurze Frage: also für meine bevorstehende Klausur hatte ich mir auch mal so verschiedene Sortieralgorithmen angeschaut, bzw gelernt. Beim InsertionSort hatte ich halt diese Variante für ein integer array und das hat auch funktioniert.. ist das jetzt gar kein richtiger InsertionSort-Algorithmus? Weil diese Variante hatte ja, wie gerade gesagt bei dem String array nicht funktioniert. Und kann man für String Arrays nicht die gleichen Sortieralgorithmen nehmen, wie für IntegerArrays? 


```
public static int [] insert ( int [] a){
        for (int i = 1; i < a.length; i++) {
            for ( int j = i; j > 0 ; j--) {
                if( a[j] < a[j-1] ) {
                    int temp = a[j-1];
                    a[j-1] = a[j];
                    a[j] = temp;
                }
            }
        } return a;
    }
```

Deine Variante funktioniert übrigens!


----------



## JStein52 (4. Aug 2015)

Doch klar kann man für Strings die gleichen Algorithmen nehmen. Nur die Vergleichsoperation ist halt spezifisch für das was man sortiert. Und deines war natürlich auch ein Insertion Sort. Das charakteristische für einen Insertion Sort ist folgendes:
Insertionsort entnimmt der unsortierten Eingabefolge ein beliebiges Element und fügt es an richtiger Stelle in die (anfangs leere) Ausgabefolge ein. Geht man hierbei in der Reihenfolge der ursprünglichen Folge vor, so ist das Verfahren stabil. Wird auf einem Array gearbeitet, so müssen die Elemente hinter dem neu eingefügten Element verschoben werden.
Und natürlich kann man das mit verschiedenen Schleifenkonstrukten auch verschieden gestalten.  Ich könnte mir im Moment nur vorstellen dass die Version die du oben für Strings und für Integer gepostet hast eben doch nicht gleich sind (auf den ersten Blick sehe ich da verschiedene Indizes usw. ) Wenn es dich genau interessiert versuche doch nochmal die Integer-Version auch wirklich 1:1 für Strings umzusetzen.


----------



## Hannek92 (4. Aug 2015)

ah okay, ganz lieben Dank für deine Antwort  Java verwirrt mich sehr schnell und da ich das vorher mit dem compareTo noch nicht hatte, war das noch verwirrender  
Hab es jetzt auch endlich geschafft, das Programm so zum laufen zu kriegen, wie es sein soll 
Ganz ganz lieben Dank


----------



## JStein52 (4. Aug 2015)

Gut dass wir drüber geredet haben


----------

