# Sring ArrayList Manuel sortieren



## Koori (1. Okt 2012)

hallihallo alle zusammen!

ich brauche Hilfe  beim sortieren von meiner Array liste, jedoch DARF ich die String sort() methode NICHT benutzen. brauche wirklich Hilfe!!

ich hab unten meinen quelltext nur mal so  


```
import java.util.ArrayList; 
import java.util.Iterator;
public class WordList{ 
    private ArrayList<String> words = new ArrayList(); 
    public WordList(){ 

    } 

    public void addWord(String word){  
        words.add(word);
    } 

    public void printWords(int i){  
        
        switch (i){
            case 1:
                        for (int index = 0; words.get(index) != null; index++ ){
                            System.out.println(words.get(index));
                        }
            
            case 2 :
                        for (String word : words){
                         System.out.println(word);
                        }
            
            case 3 :
                     
                        while ( i < words.size()){
                            System.out.println(words.get (i));
                            
                            i++;
                        }
                        
                        
            case 4 :
                        Iterator entries = words.iterator();
                        
                        while( entries.hasNext()){
                            Object element = entries.next();
                        System.out.println(element);
                        }
        }
        
        // Implementieren Sie die verschiedenen Schleifenarten 
        // Verwenden Sie das switch-Konstrukt (Buch Seite 554-555) 
        // i=0: for-Schleife 
        // i=1: for-each-Schleife 
        // i=2: while-Schleife 
        // i=3: iterator-Schleife  
    } 

    public int numberOfWords(){   
        return words.size();

        //  int rückgabe wert!!!
        //Die komplette Anzahl Wörter wird als Rückgabewert  
        // zurückgeliefert 
    } 

    public int numberOfCharactersOfWord(int i){  

        return words.get(i).length();

    } 

    public int numberOfCharactersInList(){ 

        String list = "";

        for (String word : words){
            list += word;
        }
        return list.length();
    }

}
```


----------



## Firephoenix (1. Okt 2012)

String hat doch gar keine sort()-Methode, meinst du evtl Collections.sort()?

In deinem Code fehlt auch noch die entsprechende Methode die du benutzt zum sortieren, hast du schon einen Ansatz?

Und nach welchem Schema sollst du sortieren?
Möglich wäre z.B. eine Alphabetische sortierung, oder eine Sortierung nach der Wortlänge etc.

Gruß


----------



## Gast2 (1. Okt 2012)

Von sortieren ist da nichts zu sehn, was hast du schon versucht? Welchen Sortieralgorithmus willst du implementieren?


----------



## Koori (1. Okt 2012)

@FirePhoenix: oh sorry jaja ich wollte es alphabetisch sortieren... hab aber keinen blassen schimmer wie es geht.

Mein Dozent hat gesagt das ich keine, von Java vorgefertigte sortier methode benutzen darf 



@EikeB:

ich hab erstmal gedacht das man eine > oder < verwenden kann und den String wie ein int behandeln



Könntet ihr mir weiterhelfen ???


----------



## Gast2 (1. Okt 2012)

Sortierverfahren ? Wikipedia
Da findest du eine Liste an Sortierverfahren, schau dir ein paar davon an, such dir den aus der dir am besten gefällt, und implementier den. Wenn du da ne Frage zu hast dann helfen wir dir hier gern weiter.
Deine Hausaufgaben macht dir hier aber niemand


----------



## Firephoenix (1. Okt 2012)

Grundsätzlich benötigst du zum sortieren 2 Dinge:
-Eine Methode die 2 Elemente vergleicht
-Einen Sortieralgorythmus

Möglich wäre also so etwas wie eine eigene vereinfachte compare-Methode:


```
/**
*Gibt true zurueck wenn der erste String hinter dem 2. einsortiert werden muss
*/
public boolean isFirstStringGreaterAsSecondString(String first, String second);
```

Hast du eine Idee wie du so etwas implementieren könntest? (charweise die Strings vergleichen z.B.?)

Dann brauchst du einen Algorythmus zum sortieren, relativ einfach dürfte es sein mit einer leeren Liste anzufangen, dann ein Wort nach dem anderem einzufügen (add() fügt ja immer am Ende an, also könntest du dir z.b. immer den "kleinsten" String aus deiner startliste rausnehmen und den an die leere liste anhängen).

Wenn du einen Ansatz hast zeig mal her, dann kann man damit weiterarbeiten.


```
ich nehme mal an das String.compareTo(String) ebenfalls verboten ist.
```

Gruß


----------



## hüteüberhüte (1. Okt 2012)

Darfst du die Methode compareTo ( String (Java Platform SE 6) ) verwenden? Wenn nicht, dann wirds noch etwas umständlicher...


----------



## Koori (1. Okt 2012)

mein Kopf explodiert !!!

hab mir die wiki Seite angesehen und herausgefunden das ich den "merge sort" benutzen kann. Bin im Moment diesen Code am entziffern den ich bei Stackoverflow gefunden hab.


```
/*
 * Sorting methods, implemented using mergesort to sort the array of names
 * alphabetically
 */
public String[] sort(String[] array) {
    // check if the number of elements < 2
    if (array.length > 1) {

        // divide into two smaller arrays
        // determine length of two smaller arrays
        int arrLen1 = array.length;
        int arrLen2 = array.length - arrLen1;

        // populate smaller arrays with elements from initial array
        String[] array1 = new String[arrLen1];
        String[] array2 = new String[arrLen2];

        for (int i = 0; i < arrLen1; i++) {
            array[i] = array1[i];
        }

        for (int i = arrLen1; i < array.length; i++) {
            array[i] = array2[i];
        }

        // now that we have the two halves, we can recursively call sort() on each to sort them
        array1 = sort(array1);
        array2 = sort(array2);

        // three counters are needed to keep track of where we are in the arrays, one for pos in final array, and one for each of the two halves
        // i => pos in main array
        // j => pos in array1
        // k => pos in array2
        int i = 0, j = 0, k = 0;

        while (array1.length != j && array2.length != k) {
            if (array1[i].compareTo(array2[i]) < 0) {
                // copy current element of array1 to final array as it preceeds array2's current element
                array[i] = array1[j];

                // increment the final array so we dont overwrite the value we just inserted
                i++;
                // increment array1 which we took the element from so we dont compare it again
                j++;
            }
            // If the element in array2 preceeds the element in array1

            else {
                // copy current element of array1 to final array as it preceeds array1's current element
                array[i] = array2[j];
                // increment the final array so we dont overwrite the value we just inserted
                i++;
                // increment array2 which we took the element from so we dont compare it again
                k++;
            }
        }

        // at this point one of the sub arrays have been exhausted, and no more elements to compare
        while (array1.length != j) {
            array[i] = array1[j];
            i++;
            j++;
        }

        while (array2.length != k) {
            array[i] = array2[k];
            i++;
            k++;

        }
    }

    return array;
}
```

programmiere in java erst seit knapp 4 wochen, wünschte ich könnte eine vorgefertigte methode wie String.compareTo(String) benutzen...


----------



## hüteüberhüte (1. Okt 2012)

Koori hat gesagt.:


> mein Kopf explodiert !!!
> 
> hab mir die wiki Seite angesehen und herausgefunden das ich den "merge sort" benutzen kann.



Benutz lieber Selectionsort. Bei merge sort kann zu viel schief gehen.

Weil ich ganz dreist bin und keinen Anstand kenne, werde ich das gleich einfach mal machen


----------



## Koori (1. Okt 2012)

hab gerade gesehn das es die Strings nur nach länge sortiert :/

ein tutorial vom Sortieren oder irgend ein link wäre gut
oder eine abstrakte Beschreibung des Sortier verfahren


----------



## hüteüberhüte (1. Okt 2012)

Koori hat gesagt.:


> ein tutorial vom Sortieren oder irgend ein link wäre gut



Selectionsort ? Wikipedia
Selectionsort ? Wikipedia

Kurz umrissen: Iteriere über das Array. Such das kleinste oder größte Element. Vertausche es mit dem ersten oder letzten Element. Wiederhole das Iterieren solange, bis das Array sortiert ist.


----------



## Koori (1. Okt 2012)

diese Selectionsort methode ist doch nur um die Strings nach länge zu sortieren und nicht alphabetisch.


----------



## Gast2 (1. Okt 2012)

Nein, Selectionsort ist nur ein Verfahren um Elemente zu sortieren, was genau sortiert wird bestimmt die compare Methode. Du kannst also nicht nur Strings der Länge nach sortieren.


----------



## Bernd Hohmann (1. Okt 2012)

Bubblesort, ist schnell implementiert.

Hier sortiere ich Mailhosts nach Priorität.


```
boolean blnNotSorted;
				do {
					blnNotSorted = false;
					for (int j = 0; j < records.length - 1; j++) {
						MXRecord mxrecord1 = (MXRecord) records[j];
						MXRecord mxrecord2 = (MXRecord) records[j + 1];
						if (mxrecord1.getPriority() > mxrecord2.getPriority()) {
							records[j] = mxrecord2;
							records[j + 1] = mxrecord1;
							blnNotSorted = true;
						}
					}
				} while (blnNotSorted);
```


----------



## hüteüberhüte (1. Okt 2012)

```
package javaforum;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * @author hüte
 */
public class Sortierer {

    public static List<String> sortiere(List<String> lst) { // Selectionsort, nach Länge aufsteigend
        for (int i = 0; i < lst.size() - 1; i++) {
            int kürzestes = i;
            for (int j = i + 1; j < lst.size(); j++) {
                if (lst.get(j).length() < lst.get(kürzestes).length()) {
                    kürzestes = j;
                }
            }
            if (kürzestes != i) {
                String temp = lst.get(i);
                lst.set(i, lst.get(kürzestes));
                lst.set(kürzestes, temp);
            }
        }
        return lst;
    }

    public static void main(String[] args) { // die main()-Methode
        for (int i = 0; i < 10; i++) {
            List<String> lst = Arrays.asList("55555", "4444", "333", "22", "1");
            Collections.shuffle(lst);
            sortiere(lst);
            System.out.println(lst);
        }
    }
}
```

Der Länge nach wird sortiert. sortiere könnte man auch generisch machen, so dass sie z.B. alle Listen Comparable-implementierender Klassen sortiert


----------



## Marco13 (1. Okt 2012)

Ein paar Verbesserungen zum BubbleSort werden hier beschrieben: BubbleSort


----------

