# Array sortiert ausgeben



## P83x (10. Apr 2011)

Hallo!

Wir sollen als Infohausaufgabe eine array zahlenfolge sortiert ausgeben.
Das mit dem ausgeben schaffe ich noch, aber das mit dem sortieren schaffe ich irgendwie nicht.
Kann mir jmd. dabei helfen?


```
class ArrayAusgeben
{

  public static void main ( String[] args )
  {
    int[] x = { 4, 9, 1, 7, 3, 8, 2, 5, 6 };

    for ( int i= 0 ; i < 9 ; i++ )
    {
      System.out.println( x[ i ] );
    }
  }
}
```


----------



## XHelp (10. Apr 2011)

Keinen einzigen Ansatz? Nicht mal das rausfinden von der größten Zahl?


----------



## P83x (10. Apr 2011)

mein problem ist, das ich wirklich überhaupt keine ahnung habe wie ich es tuhen soll :/ mein einziger ansatz wäre das ausgeben von den variabelen, aber beim sortieren hörts auf.


----------



## AlfAtor (10. Apr 2011)

Überleg dir mal wie du die Zahlen selber sortieren würdest. Du würdest dir die kleinste Zahl raussuchen und dann die nächst größere etc. Versuche mal das auf dem Papier zu machen, und zwar Schritt für Schritt, und notiere dabei immer was sich dabei verändert.


----------



## XHelp (10. Apr 2011)

Ja, aber ihr werdet ja wohl irgendwas im Unterricht behandelt haben?
Hast du auch die Suchfunktion im Forum verwendet oder gar google? Ist ja nicht so, dass kein Mensch zuvor ein Array sortiert hat


----------



## AlfAtor (10. Apr 2011)

Naja, er soll ja nicht alles abschreiben, sondern das auch verstehen, was er macht. Also wenn der TO noch da ist, gehen wir alles Schritt für Schritt durch und haben in ner Stunde ne fertige Hausaufgabe und alles verstanden.


----------



## P83x (10. Apr 2011)

Im Internet finde ich nur die Befehle, die es machen.

Doch ich will es ohne einen Befehl schaffen...
Die letzte Hausaufgabe war, unseren Namen nach dem Alphabet zu sortieren, dies hat auch wunderbar bei mir geklappt doch jetzt bin ich hilflos...
[Java]public class stringNameNachAlphabet {
  public static void main (String args[]) {
    String text = "Blub Dub";
    String name1= text.substring(0,5);

    String name2= text.substring(6,12);

    int i = name1.compareTo(name2);
    int x = name2.compareTo(name1);

    if(x>i){
      System.out.println(name1);
      System.out.println(name2);
    }

    if(i>x){
      System.out.println(name2);
      System.out.println(name1);
    }
  }
}
[/code]
Edit: Hab nur meinen namen ersetzt, dehalb stimmen die zahlen nicht.
Was ich schon versucht habe ist die ganzen zahlen in einem int zu deklarieren, also y = 4917..., dann jede einzelne zahl mit einem string deklarieren und zum schluss könnte ich es sortieren. Doch ich bekomme irgendwie die zahlen nur einzelnd ausgespuckt und nicht zusammen...


----------



## P83x (10. Apr 2011)

vielleicht hilft das noch jmd, das habe ich von der tafel abgeschrieben (also die einzigen informationen die wir dort bekommen haben)
Strings: 
	
	
	
	





```
String x="Hallo";
      
      int a = x.length();  // 5, weil Hallo 5 buchstaben hat

      int b = x.compareToIgnoreCase("hallo");  // vergleicht alphabetisch, ignoriert groß und kleinschreibung
      
      int c = x.compareTo("hallo"); // vergleicht alphabetisch
      
      String y= x.substring(1,4);
      
      boolean m = x.equals("hallo"); // boolean = ob wahr oder flasch ist, mit IgnoreCase wird wieder groß und kleinschreibung ignoriert.
```
und

array
	
	
	
	





```
public class ArrayInformation {

  public static void main(String[] args) {

    //int x[]= new int[10];
    //die 1. x variable mit 1 intialisieren:
    //x[0]=1;
    //x[1]=2;
    //.
    //.
    //.
    //x[9]=10;
    //Zählweise beim computer beginnt immer mit 0!!
    
    //mit einer schleife es machen:
    
    int[]hallo = new int[10];
    
    for(int i=0; i<10; i++){
      hallo[i]=i+1;
      System.out.println(hallo[i]);
    }

    // int[] x= new int[
    // die zahlen werden dort zugewiesen x0 = x6
  }
}
```


----------



## Cola_Colin (10. Apr 2011)

```
import java.util.Arrays;

public class Sortiere {
    public static void main(String[] args) {
        int[] x = {4, 9, 1, 7, 3, 8, 2, 5, 6};
        Arrays.sort(x);
        System.out.println(Arrays.toString(x));
    }
}
```


Nein mal ernsthaft, du wirst wohl eine Methode im Stile von Arrays.sort schreiben müssen.
Am einfachsten wäre wohl Bubblesort ? Wikipedia


----------



## AlfAtor (10. Apr 2011)

P83x hat gesagt.:


> Hallo!
> 
> Wir sollen als Infohausaufgabe eine array zahlenfolge sortiert ausgeben.
> Das mit dem ausgeben schaffe ich noch, aber das mit dem sortieren schaffe ich irgendwie nicht.
> ...





Also die Aufgabe ist ja Zahlen zu sortieren. Du nimmst also die kleinste Zahl und schreibst die in ein Array an die erste Stelle. Dann die nächste usw. Um herauszufinden, welche Zahl die kleinste ist, musst du erst mal alle Zahlen miteinander vergleichen. Dafür nimmst du die erste x[0] und vergleichst die mit der nächsten, x[1] und dann mit der nächsten x[2].

Das ganze kannst du auch in einer Schleife machen. Also versuch jetzt erstmal eine for-Schleife zu schreiben, die das macht. Als Beispiel kannst du das hier nehmen:


```
for ( int i= 0 ; i < 9 ; i++ )
    {
      System.out.println( x[ i ] );
    }
```


----------



## P83x (10. Apr 2011)

ich kann dir irgendwie nicht folgen :S
ich habe doch die zahlen in meinem x array deklariert und jetzt soll ich noch mal die zahlen in einen anderen array deklarieren? ich versteh irgendwie den sinn nicht...

edit: nach erneutem lesen glaube ich dich verstanden zu haben.
doch ich will die zahlen ja nicht per hand einfügen. sonst könnte ich doch gleich ...println("1,2,... schreiben. Wenn ich die Zahlen einzelnd habe, kann ich sie auch sortieren aber mein problem ich, das ich sie nicht einzelnd bekomme oder nicht weiß wie es funktioniert. Und ich glaube auch das mein array wissen ziemliche lücken aufweist, da wir es nur in 1 std besprochen haben


----------



## XHelp (10. Apr 2011)

Du hängst dich vermutlich zu sehr an die Vorstellung "sortiert ausgeben". Du musst natürlich zuerst die Zahlen im Array sortieren und erst dann ausgeben.


----------



## AlfAtor (10. Apr 2011)

Ah, du musst kein zweites Array nehmen. Du nimmst dein Array und gehst in einer Schleife eine Zahl nach der anderen durch. Und in der Schleife überprüfst du dann ob die erste Zahl kleiner ist als die Anderen. Und dann schreibst du die kleinste Zahl an erste Stelle.

x[0] ist die erste Zahl. 


```
int kleinste = 0;

for ( int i= 0 ; i < 9 ; i++ )
{
   if (x[0] > x[i+1]) // Hier wird die erste Zahl mit der nächsten und über nächsten etc verglichen.
                          // Wenn die erste größer ist als die andere, müssen die Zahlen vertauscht werden.
   {
      kleinste = x[i+1];  // Hier werden die beiden verglichenen Zahlen vertauscht.
      x[i+1] = x[0];
      x[0] = kleinste;
   }
}
```

edit: 
Das ganze kannst du dann wie gehabt ausgeben. wenn die erste zahl dann die kleinste ist, ist es gut. wenn du das geschafft hast, ist der erste schritt getan. der rest ist dann einfach.


----------



## P83x (10. Apr 2011)

danke für deine hilfe, doch als ich es eingesetzt habe kam irgendwie was komisches raus, aber ich habe das prinzip verstanden. Hab es dann ein bisschen umgeschrieben, doch weiß jetzt nicht was daran falsch ist: (beim starten des programmes kommt nichts raus!"

```
public class ArraySortiert {


  public static void main ( String[] args )
  {
    int kleinste = 0, y = 0;
    int[] x = { 4, 9, 1, 7, 3, 8, 2, 5, 6 };

    for ( int i= 1 ; i == 9 ; i++ )
    {
      if (x[y] > x[i]){

        kleinste = x[i];
        x[i] = x[y];
        x[y] = kleinste;

      }
      System.out.println( x[ i ] );
      y++;
    }



  }
}
```

edit: habs mir so gedacht, das ich zwei zahlen habe i und y. y fängt bei 0 and und i bei 1. die beiden nehmen dann die zahlen aus dem array, also y = 4 und i = 9. y ist nciht > als 9, also wird y 1 und i 2, das wird so weiter gehen bis am ende: 4 1 7 3 8 2 5 6 9 rauskommen sollte, doch es kommt nichts raus...


----------



## AlfAtor (10. Apr 2011)

Super! Also der Trick ist jetzt, dass du zuerst die kleinste Zahl raussuchst und dann die Zweitkleinste usw. Dafür brauchst du zwei Schleifen, die ineinander verschachtelt sind. Schau dir mal den Code an:


```
public class BubbleSort    // BubbleSort nennt sich das Sortierverfahren
{
	   public static void sortiere(int[] x) {
	      int temp;
	      
	      for (int j=0; j < x.length; j++)    // Hier fängt die äussere Schleife an
                                                          // Die geht von der ersten bis zur letzen Zahl durch
                                                          // x.lenght ist die Länge von deinem Array
	      {
	         for (int i=j; i < x.length-1; i++)    // Und hier die Innere. Jetzt wird für jede Stelle
                                                              // überprüft, welche die Kleinere ist.
	            if (x[j] > x[i+1]) {                      
	               temp       = x[j];
	               x[j]       = x[i+1];
	               x[i+1]     = temp;
	            }          
	      } 
	   }
	   
	   public static void main(String[] args) {
	      int[] liste = {0,9,4,6,2,8,5,1,7,3};
	      sortiere(liste);
	      for (int i=0; i<liste.length; i++) 
	         System.out.print(liste[i]+" ");    
	   } 
}
```


----------



## P83x (10. Apr 2011)

Ich wäre nie auf so eine geniale Idee gekommen!! danke 

nur eine frage hätte ich und zwar:
mir ist nicht klar weshalb man am anfang public static void sortiere   *(int[] x)* schreibt. 
So weit ich mich erinnere braucht man doch nur den namen, in unserem fall sortiere. Was hat jetzt das (int[] x] für ne bedeutung?


----------



## Cola_Colin (10. Apr 2011)

Das ist der Parameter, den brauchst du, damit der Array an die Methode übergeben werden kann.
[c]sortiere(liste);[/c]

liste wird zu x innerhalb der Methode.


----------



## P83x (10. Apr 2011)

könnte man nicht von anfang an liste durch x ersetzen und dafür das (int[] x) weglassen?
und irgendwie verstehe ich die innere schleife nicht. Ich weiß was sie bewirkt, kann aber nicht nachvollziehen wie sie bewirkt. Was die einzelne abläufe sind.
Also ich verstehe es bis jetzt so:

Die äußere schleife fängt bei der zahl 0 an und hört auf wenn j == x ist, also 8(???)

dann kommt die innere schleife. die innere schleife setzt i j gleich und die innere schleife hört auf wenn x.length-1 ist, was das -1 bedeuten soll weiß ich nicht.

wenn x[0], also 0 größer als x[i+1] ist, also 9 dann werden die werte vertauscht.

weiter verstehe ich es nicht mehr. ich verstehe nur den ersten schritt, wahrscheinlich weil ich nicht weiß was das -1 bedeuten soll


----------



## AlfAtor (10. Apr 2011)

P83x hat gesagt.:


> dann kommt die innere schleife. die innere schleife setzt i j gleich und die innere schleife hört auf wenn x.length-1 ist, was das -1 bedeuten soll weiß ich nicht.
> 
> weiter verstehe ich es nicht mehr. ich verstehe nur den ersten schritt, wahrscheinlich weil ich nicht weiß was das -1 bedeuten soll



x.length ist die Länge von x. Also 9. Die for-Schleife geht aber von 0-8, weil das Array mit x[0] anfängt.


----------



## Cola_Colin (10. Apr 2011)

P83x hat gesagt.:


> könnte man nicht von anfang an liste durch x ersetzen und dafür das (int[] x) weglassen?


Stell dir vor, du hast 3 Arrays, die du alle sortieren möchtest.
Die haben 3 verschiedenen Namen.

Mit dem Parameter kannst du die Methode jeweils mit den 3 Arrays aufrufen, ohne eben nicht.


----------



## Firephoenix (10. Apr 2011)

P83x hat gesagt.:


> könnte man nicht von anfang an liste durch x ersetzen und dafür das (int[] x) weglassen?
> und irgendwie verstehe ich die innere schleife nicht. Ich weiß was sie bewirkt, kann aber nicht nachvollziehen wie sie bewirkt. Was die einzelne abläufe sind.
> Also ich verstehe es bis jetzt so:
> 
> ...



Hi,
am besten ist es, du gehst das ganze mal auf dem papier durch.
Mal dir Felder für i,j,temp in die du reinschreibst was gerade für ein wert drin ist.
Dann gehst du Zeilenweise die Schleifen durch (verbessert auch super das Verständnis von Schleifen) und schaust was rauskommt.
Bsp:

```
int[] zahlenArray = new int[] {4,2,1,3,6};
//zahlenArray: [0]->4, [1]->2, [2]->1, [3]->3, [4]->6
```

Lass das mal durchlaufen, das könnte dann in etwa so aussehen:


> *Das Array sieht so aus:
> [0]->2, [1]->4, [2]->1, [3]->3, [4]->6*
> i = 0
> j = 0
> ...



Wenn man einmal erkannt hat was ein Codeblock (z.b. der If-Befehlsblock) macht, kann man sich einige Schritte sparen. So kann man auch längeren Code recht flott nachvollziehen, für komplexere Sachen gibt es Debugger (z.b. in Eclipse), bei denen du zur Laufzeit Variablenwerte abfragen kannst.

Gruß


----------



## P83x (11. Apr 2011)

danke an firephoenix. Du hast recht so kann man es wirklich viel leichter nachvollziehen

zu cola_colin: was mich stört ist, das im parameter ein array aufgerufen wird, aber mit einem anderen namen und er trotzdem die richtigen zahlen übernimmt??


```
/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 11.04.2011
  * @author
  */

public class ArraySortiert{

        public static void main(String[] args) {
          int[] array = {4,9,1,7,3,8,2,5,6};

          sortiere(array);

          for (int i=0; i<array.length; i++){
           System.out.print(array[i]+" ");
        }
       }

       public static void sortiere(int[] array) {
          int z;

          for (int l=0; l < array.length; l++)
          {
             for (int i=l; i < array.length-1; i++){

                if (array[l] > array[i+1]) {
                   z      = array[l];
                   array[l]   = array[i+1];
                   array[i+1] = z;
                }
             }
          }

       }
}
```
so sieht meins umgeschrieben und für mich plausibel aus!
Doch AlfAtor hat bei diesem schritt: public static void sortiere(int[] array) x anstatt array geschrieben und die zahlen wurden alle übernommen und das verwirrt mich, denn wir haben den array in meinem beispiel den namen array gegeben und nicht x...
oder geht es nur weil es der einzige array in unserem programm ist? Denn wenn wir bsp. int[] array und int[] schleife haben, und dann man im unterprogramm (int[] x) schreibt, woher soll dann der computer wissen ob ich array oder schleife gemeint habe?? Und ich hab auch gemerkt das bei der for schleife { und } nicht hinzugefügt wurde, ich glaube es ist genau dasselbe, als wenn man die klammern hinzufügt, weil auch das ergebnis gleich ist, oder? Und meine letzte frage, darf man im unterprogramm auch public static void sortiere(){ schreiben? nur da muss man alles neu deklarieren, da man keine werte "mit genommen" hat, richtig? und kann man, wenn es stimmt auch mehrere ergebnisse übertragen, durch z.b. ein ; ?

Da waren jetzt viele Fragen, doch das sind auch meine einzigen zum thema ^^ 

vielen dank für eure geduld und euer verständniss, wenn ich mich blöd angestellt habe

Gruß!


----------



## Firephoenix (11. Apr 2011)

Das "x" an dieser Stelle ist ein sogenannter Parameter (hier ist Grundlagen-Nachholbedarf :rtfm
Als einfaches Beispiel:
In irgend einem Programm kommt vielleicht ganz oft sowas vor:
Eine Zahl wird mit einer anderen multipliziert und auf das Ergebnis wird wieder die erste Zahl addiert.
Die Rechnung ist überall die gleiche, nur die Zahlen ändern sich.
Also lagere ich mir die Rechnung in eine eigene Funktion aus, die das Berechnet und das Ergebnis zurückgibt.
Aus


> (x*y)+x


machen wir also:

```
public static int irgendEinFunktionsname(int x, int y){
return (x*y)+x;
}
```
(und ja mir ist bekannt, dass man Punktrechnung dort nicht Klammern muss, ich mach sowas aber trotzdem gerne um es bei größeren Termen lesbarer zu machen.
Jetzt kann ich jedes mal wenn in meinem Programm solche Stellen vorkommen

```
3*4+3;
2*100+2;
4*2+4;
```
diese durch

```
irgendEinFunktionsname(3,4);
irgendEinFunktionsname(2,100);
irgendEinFunktionsname(4,2);
```
ersetzen. Und ob ich die Funktion dabei so schreibe:

```
public static int irgendEinFunktionsname(int x, int y){
return (x*y)+x;
}
```

oder so:

```
[code=Java]public static int asasdfasdf(int bbbhhdd, int rrrasdas){
return (bbbhhdd*rrrasdas)+bbbhhdd;
}
```
ändert nur die Lesbarkeit, da das lediglich Variablen sind und die kannst du nennen wie du willst.
Falls du etwas Lektüre zu Methoden haben willst:
Galileo Computing :: Java ist auch eine Insel – 2.8 Methoden einer Klasse

Und auf dein Beispiel bezogen:
in der sortiere() heißt das zu sortierende Array zwar x, aber schau mal was du Java hier sagst:

```
sortiere(array);
```
Was im Hintergrund passiert kannst du dir einfach als eine zuweisung vorstellen wie

```
x = array;
```
und dannach läuft das sortieren.
Was man dabei noch im Hinterkopf behalten sollte ist, dass du an der Stelle allerdings tatsächlich das array sortierst, da java bei Objekten und Zuweisungen keine Kopien der Objekte erstellt, aber das ließt du dir besser selber nach 
Gruß


----------



## P83x (11. Apr 2011)

Edit: asooooooooo^^ habs jetzt verstanden. durch das sortiere(*array*); greift er erstmal auf meine methode zu, mit den werten von array! Wie man sie in der methode nennt, ist ganzalleine für die methode wichtig und nicht für unsere "hauptmethode". Wenn ich jetzt meine 3 sachen durch barray ersetzt habe, gibt er auch die 0 aus, d.h. er nimmt die werte von barray.





ich bin überfordert :S und die Seite hilft mir auch nicht bei meinem problem... Hab ein bisschen rumgetüftelt aber weiß immer noch nicht wie das java programm weiß, das es meinen array mit dem namen array nehmen soll und nicht mein anderes array mit dem namen barray.

```
public class ArraySortiert{

        public static void main(String[] args) {
          int[] barray = {0,9,8,7,6,5,4,3,2,1};
          int[] array = {4,9,1,7,3,8,2,5,6};


          sortiere(array);

          for (int i=0; i<array.length; i++){
           System.out.print(array[i]+" ");
        }
       }

       public static void sortiere(int[] x) {
          System.out.println(x[0]);
          int z;

          for (int l=0; l < x.length; l++)
          {
             for (int i=l; i < x.length-1; i++){

                if (x[l] > x[i+1]) {
                   z      = x[l];
                   x[l]   = x[i+1];
                   x[i+1] = z;
                }
             }
          }

       }
}
```
 hab die position getauscht und trotzdem nimmt er "array"


----------



## XHelp (11. Apr 2011)

[JAVA=8]          sortiere(array); //was meinst du warum hier ARRAY steht?

          for (int i=0; i<array.length; i++){ //oder hier
           System.out.print(array_+" "); //oder hier??
        }[/code]_


----------



## AlfAtor (11. Apr 2011)

P83x hat gesagt.:


> Edit: asooooooooo^^ habs jetzt verstanden. durch das sortiere(*array*); greift er erstmal auf meine methode zu, mit den werten von array! Wie man sie in der methode nennt, ist ganzalleine für die methode wichtig und nicht für unsere "hauptmethode". Wenn ich jetzt meine 3 sachen durch barray ersetzt habe, gibt er auch die 0 aus, d.h. er nimmt die werte von barray.




Genau, darum geht es in Methoden, dass man sie mehrmals verwenden kann. 



```
sortiere(array);
sortiere(barray);
```




P83x hat gesagt.:


> vielen dank für eure geduld und euer verständniss, wenn ich mich blöd angestellt habe




Du hast dich keineswegs blöd angestellt. Ganz im Gegenteil :toll:


----------

