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?
Java:
classArrayAusgeben{publicstaticvoid 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 ]);}}}
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.
Ü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.
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
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.
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(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...
vielleicht hilft das noch jmd, das habe ich von der tafel abgeschrieben (also die einzigen informationen die wir dort bekommen haben)
Strings:
Java:
String x="Hallo";int a = x.length();// 5, weil Hallo 5 buchstaben hatint b = x.compareToIgnoreCase("hallo");// vergleicht alphabetisch, ignoriert groß und kleinschreibungint c = x.compareTo("hallo");// vergleicht alphabetischString 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
Java:
publicclassArrayInformation{publicstaticvoidmain(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 =newint[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}}
importjava.util.Arrays;publicclassSortiere{publicstaticvoidmain(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
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?
Java:
classArrayAusgeben{publicstaticvoid 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 ]);}}}
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:
Java:
for(int i=0; i <9; i++){System.out.println( x[ i ]);}
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
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.
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.
Java:
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.
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!"
Java:
publicclassArraySortiert{publicstaticvoid 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...
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:
Java:
publicclassBubbleSort// BubbleSort nennt sich das Sortierverfahren{publicstaticvoidsortiere(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;}}}publicstaticvoidmain(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]+" ");}}
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?
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
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
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
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:
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
Bedingung der if-Abfrage:
[0](=4) > [1](=2) -----> ergibt true da 4 größer 2
also wird der Befehlsblock des if ausgeführt
die 4 aus [0] wird in temp abgelegt
dann wird [1](=2) in [0] geschrieben, [0] ist jetzt 2
und jetzt wird [1](=2) mit temp(=4) überschrieben [1]ist jetzt 4
[0] und [1] haben also getauscht (Ein sogenannter Dreieckstausch). Das Array sieht jetzt so aus:
[0]->2, [1]->4, [2]->1, [3]->3, [4]->6
Die Innere Schleife ist beendet, i wird erhöht
i = 1
j = 0
die länge-1 ist 4, 1 < 4 also läuft die innere Schleife nochtmal
If-Bedingung: [1](=4) > [2](=1) == true
Dreieckstausch wird durchgeführt (siehe oben) Das Array sieht jetzt so aus:
[0]->2, [1]->1, [2]->4, [3]->3, [4]->6
Wir erhöhen wieder i (ist jetzt 2) und prüfen auf Schleifenende (2 < 4 = true)
Die innere Schleife läuft erneut:
i = 2
j = 0
[2](=4) > [3](=3)
Dreieckstausch Das Array sieht jetzt so aus:
[0]->2, [1]->1, [2]->3, [3]->4, [4]->6
usw.
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.
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??
Java:
/**
*
* Beschreibung
*
* @version 1.0 vom 11.04.2011
* @author
*/publicclassArraySortiert{publicstaticvoidmain(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]+" ");}}publicstaticvoidsortiere(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
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
(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
Und auf dein Beispiel bezogen:
in der sortiere() heißt das zu sortierende Array zwar x, aber schau mal was du Java hier sagst:
Java:
sortiere(array);
Was im Hintergrund passiert kannst du dir einfach als eine zuweisung vorstellen wie
Java:
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ß
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.
Java:
publicclassArraySortiert{publicstaticvoidmain(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]+" ");}}publicstaticvoidsortiere(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"
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.