Arrays überschreiben und erzeugen
lima-city → Forum → Programmiersprachen → Java
berechnen
berechnung
bereich
code
division
eintragen
element
ergebnis
feld
index
liste
problem
quotient
schleife
system
teddy
url
verwenden
zahl
zeile
-
Hallo Leute,
ich probiere einen Radix Algorithmus zu programmieren. Dafür habe ich mir ein Array angelegt mit Beispiel- Zahlen die sortiert werden sollen, außerdem noch ein Paar um die Spalten und Zeilen zu generieren und eine Art "Spielfeld". Das ganz habe ich in zwei for Schleifen gemacht. Als nächstes möchte ich mittels modulo durch zehn Teilen, um so die Zahlen in mein kleines Feld ein zu sortieren.. Um das mal zu verdeutlichen, so sieht das Feld aus:
0 1 2 3 4 5 6 7 8 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Problem ist nun: Ich möchte die Zahlen, die ich geteilt habe der entsprechenden Spalte zuordnen, dann die Zeile dafür mit den Zahlen aus dem Array "liste" wieder ersetzen und zwar untereinander (deshalb auch mehrere Zeilen). Habe nur leider keine Idee, wie ich das machen soll. :/ Hier der bisherige Code:
public class main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int[] liste = { 56410, 94032, 83512, 90459, 53419 }; int[] spalte = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int step1 = spalte.length; int step2 = liste.length; int[][] feld = new int[step1][step2]; System.out.println("0 1 2 3 4 5 6 7 8 9"); for (int i = 0; i < liste.length; i++) { for (int j = 0; j < spalte.length; j++) { System.out.print(feld[j][i] + " "); } System.out.println(); } for (int x = 0; x < step2; x++){ int ln = liste[x]%10; System.out.println(ln); } } }
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
kill-a-teddy schrieb:
Kannst du das bitte mal "händisch" "vorzeigen", damit wir wissen was das Programm machen soll?
Problem ist nun: Ich möchte die Zahlen, die ich geteilt habe der entsprechenden Spalte zuordnen, dann die Zeile dafür mit den Zahlen aus dem Array "liste" wieder ersetzen und zwar untereinander (deshalb auch mehrere Zeilen). Habe nur leider keine Idee, wie ich das machen soll. :/
So kann ich es mir jedenfalls noch nicht vorstellen (eventuell liegts auch an der Müdigkeit, das kann ich dir nicht sagen). -
hackyourlife schrieb:
kill-a-teddy schrieb:
Kannst du das bitte mal "händisch" "vorzeigen", damit wir wissen was das Programm machen soll?
Problem ist nun: Ich möchte die Zahlen, die ich geteilt habe der entsprechenden Spalte zuordnen, dann die Zeile dafür mit den Zahlen aus dem Array "liste" wieder ersetzen und zwar untereinander (deshalb auch mehrere Zeilen). Habe nur leider keine Idee, wie ich das machen soll. :/
So kann ich es mir jedenfalls noch nicht vorstellen (eventuell liegts auch an der Müdigkeit, das kann ich dir nicht sagen).
Klar, also ich hab die "Tabelle / das Feld" und teile die Zahlen, die ich dann anschließend sortiere...
Feld: 0 1 2 3 4 5 6 7 8 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Zahlen: { 56410, 94032, 83512, 90459, 53419 } Teilen und Rest ausgeben: x=10 56410:x= 0 //Also spalte null 94032:x=2 //Also spalte zwei 83512:x=2 //Also spalte neun 53419:x=9 //Also spalte neun Ergebniss: 0 1 2 3 4 5 6 7 8 9 56410 0 94032 0 0 0 0 0 0 83512 0 0 83512 0 0 0 0 0 0 53419
Sobald die schleife dann abgearbeitet ist, erhöht sich dann x und wird von 10 zu 100... -
kill-a-teddy schrieb:
Und dann? Wie geht das dann weiter?
Sobald die schleife dann abgearbeitet ist, erhöht sich dann x und wird von 10 zu 100... -
hackyourlife schrieb:
kill-a-teddy schrieb:
Und dann? Wie geht das dann weiter?
Sobald die schleife dann abgearbeitet ist, erhöht sich dann x und wird von 10 zu 100...
naja danach wird durch 100 geteilt, 1000, 10.000 je nach dem wie groß die Zahlen sind und irgendwann ist alles in der Spalte null nach Größe sortiert :D -
Hallo kill-a-teddy,
ich denke, Du willst den Radix-Sort implementieren. Dazu hat Wikipedia Vorlagen in C, C++ und Python:
http://en.wikipedia.org/wiki/Radix_sort
Der C-Code sollte sich eigentlich leicht portieren lassen.
Beitrag zuletzt geändert: 9.8.2012 22:38:06 von darkpandemic -
darkpandemic schrieb:
Hallo kill-a-teddy,
ich denke, Du willst den Radix-Sort implementieren. Dazu hat Wikipedia Vorlagen in C, C++ und Python:
http://en.wikipedia.org/wiki/Radix_sort
Der C-Code sollte sich eigentlich leicht portieren lassen.
Das ist aber alles net java, außerdem hab ich das Prinzip und bla ja schon fertig, ich muss nur noch wissen, wie ich nu mein Feld überschreiben kann ^^
PS: Wenn möglich bitte in Worten erklären, nicht mit Code da ich selbst lernen möchte...
Beitrag zuletzt geändert: 9.8.2012 23:23:27 von kill-a-teddy -
Hallo kill-a-teddy,
Felder überschreiben sollte z.B. mit
feld[i][j] = liste[foobar];
funktionieren. Da ich Dir aber den Spaß nicht verderben will soll das der einzige Java-Code sein, den ich hier angebe
Zum Vorgehen:
Um eine Ziffer (in dezimaler Darstellung) aus dem Integer zu extrahieren musst Du die Zahl erst durch eine Zehnerpotenz (1, 10, 100, ...) teilen (mittels Integerdivision) und anschließen modulo 10 rechnen.
D.h. du brauchst eine Variable, welchen den Divisor speichert. Am Anfang musst Du diese auf 1 setzen. Dazu brauchst Du eine Schleife, in der für jedes Listenelement gemäß obiger Rechnung die entsprechende Ziffer extrahiert wird und am Ende musst Du den Divisor mit 10 multiplizieren um ihn für den nächsten Schleifendurchlauf vorzubereiten. Diese Schleife wird so lange ausgehührt bist alle Integerdivisionen 0 (Null) ergeben haben (boolsche Variable als Flag welche bei einer Division mit Ergebnis ungleich 0 gesetzt wird). Dann ist man nämlich fertig.
In der Schleife selber muss also ein Schleife enthalten sein, welche über alle Listenelemente geht. Der Elementindex ist der Zeilenindex in welcher die Zahl eingetragen werden muss. Das Ergebnis obiger Division und Modulo-Rechnung ist der Spaltenindex.
Wenn Du soweit bist, dann hast Du erstmal alles was Du brauchst um die Zahlen in das Feld einzutragen.
Danach benötigst Du noch eine Schleife, um die partiell sortierten Zahlen wieder in die Liste zu Schreiben. Diesmal musst Du das Feld spaltenweise auslesen, d.h. Du brauchst eine Doppelschleife, wobei die äußere über die Spalten und die innere über die Zeilen läuft.
Wenn Du jetzt ein Feld findest, dass ungleich 0 ist, dann trägst Du den Wert in der Liste ein. Hier stellt man fest, dass man noch einen Schreibindex für die Liste benötigt um zu wissen an welcher Position in der Liste man gerade schreiben soll. D.h. eine Integer-Variable, die am Anfang auf 0 gesetzt ist und nach jedem Eintrag in die Lister um Eins erhöht wird.
Wenn Du das dann alles hast, dann sollte es funktionieren.
Beitrag zuletzt geändert: 10.8.2012 18:21:02 von darkpandemic -
darkpandemic schrieb:
Felder überschreiben sollte z.B. mit
feld[i][j] = liste[foobar];
funktionieren. Da ich Dir aber den Spaß nicht verderben will soll das der einzige Java-Code sein, den ich hier angebe
Danke soweit.. Stehe vor dem nächsten Problem, beim erzeugen der Liste, Inder ich meine Ausgabe speichere. Und zwar rechne ich mein Array ja modulo zehn, dabei wird zwei mal die selbe Zahl rauskommen nämlich die 2 und die 9... Mein Array
gibt also ausint[] liste = { 56410, 94032, 83512, 90459, 53419 };
. Deshalb bekomme ich jedesmal eine Index out of Bunds exception, wenn ich das durch die If-Schleifen jage...0,2,2,9,9
Ich habe also eine Liste angelegt, um eine neue Zeile zu generieren.. Sieht ein wenig wirr war aus, bin ja auch kein Java Profi, aber es tut was es soll.. Ich denke mal meine Lösung wäre, dass ich die Ausgaben mit einem Komma trennen kann, ich habe leider keine Idee wie?
Hier mal ganzer Code:
import java.util.*; public class main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int[] liste = { 56410, 94032, 83512, 90459, 53419 }; int[] spalte = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int step1 = spalte.length; int step2 = liste.length-1; int[][] feld = new int[step1][step2]; System.out.println("0 1 2 3 4 5 6 7 8 9"); for (int i = 0; i < step2; i++) { for (int j = 0; j < spalte.length; j++) { System.out.print(feld[j][i] + " "); } System.out.println(); } for (int x = 0; x < step2; x++){ int st = (liste[x]%10); String st1 = Integer.toString(st); List<Object> list1 = new ArrayList<Object>(); if (st1.contains("0") == true){ list1.add(0, liste[0]); System.out.println(list1); } if (st1.contains("1") == true){ list1.add(1, liste[1]); System.out.println(list1); } // if (st1.contains("2") == true){ // list1.add(2, liste[2]); // System.out.println(list1); // } if (st1.contains("3") == true){ list1.add(3, liste[3]); System.out.println(list1); } if (st1.contains("4") == true){ list1.add(4, liste[4]); System.out.println(list1); } if (st1.contains("5") == true){ list1.add(5, liste[5]); System.out.println(list1); } if (st1.contains("6") == true){ list1.add(6, liste[6]); System.out.println(list1); } if (st1.contains("7") == true){ list1.add(7, liste[7]); System.out.println(list1); x = 0; } if (st1.contains("8") == true){ list1.add(8, liste[8]); System.out.println(list1); } // if (st1.contains("9") == true){ // list1.add(9, liste[9]); // System.out.println(list1); // } } } }
Die Auskommentierten bereiche sind im Moment die Problembereiche... -
Hallo kill-a-teddy,
warum verwendest Du denn Dein 'feld' nicht? Damit hättest Du doch das Problem mit den doppelten Ziffern (und der Ausgabe) gar nicht.
Die Index-Out-Of-Bound-Exception bekommst Du deshalb, weil ArrayList.Add(int index, Object element) einen Index im Bereich 0 bis einschließlich ArrayList.size() erwartet. Wenn bei Dir die Ziffer '2' das erste mal kommt ist aber erst ein Element in der Liste, weshalb Du nur bei 0 oder 1 einfügen darfst. Das list1.Add(2, 94032) fliegt Dir dann natürlich um die Ohren. -
darkpandemic schrieb:
Hallo kill-a-teddy,
warum verwendest Du denn Dein 'feld' nicht? Damit hättest Du doch das Problem mit den doppelten Ziffern (und der Ausgabe) gar nicht.
Die Index-Out-Of-Bound-Exception bekommst Du deshalb, weil ArrayList.Add(int index, Object element) einen Index im Bereich 0 bis einschließlich ArrayList.size() erwartet. Wenn bei Dir die Ziffer '2' das erste mal kommt ist aber erst ein Element in der Liste, weshalb Du nur bei 0 oder 1 einfügen darfst. Das list1.Add(2, 94032) fliegt Dir dann natürlich um die Ohren.
okay das erscheint mir logisch.. um in das feld zu schreiben muss ich aber doch erst die berechnung machen denn sonst habe ich ja keine einträge. oder verstehe ich da grad was falsch?
wenn ich nu zwei listen anlege, eine die doppelte zahlen noch temporär speichert würde das wohl mein problem lösen ^^ -
Hallo kill-a-teddy,
kill-a-teddy schrieb:
das siehst Du durchaus richtig. Aber Du brauchst Dir die Ergebnisse der Rechnungen ja nicht dauerhaft in einer Liste zu merken. Die Zeile des Feldes, in das Du die Zahl schreiben musst kennst Du ja bereits, da das ja Dein aktueller Listenindex ist. D.h. das erste Element der Liste (Elementindex = 0) muss irgendwo in der ersten Zeile (Zeilenindex = 0) eingetragen werden, das zweite Listenelement (Elementindex = 1) muss irgendwo in der zweiten Zeile (Zeilenindex = 1) eingetragen werden, ..., das n+1-te Listenelement (Elementindex = n) muss irgendwo in der n+1-ten Zeile (Zeilenindex = n) eingetragen werden.
...
okay das erscheint mir logisch.. um in das feld zu schreiben muss ich aber doch erst die berechnung machen denn sonst habe ich ja keine einträge. oder verstehe ich da grad was falsch?
Was Du berechnen musst ist dann der zugehörige Spaltenindex. Dazu reicht es aber aus eine Integervariable zu verwenden. Da man das Ergebnis der Division aber auch benötigt um festzustellen ob der Sortiervorgang abgeschlossen ist solltest Du besser gleich zwei verwenden. Die erste nennst Du z.B. 'quotient' und weist ihr das Ergebnis von der Division des Listenelementes mit Deinem Divisor zu. Die zweite nennst Du dann z.B. 'spaltenindex' und weist ihr den Wert des Quotienten Modulo 10 zu. Mit Hilfe des Elementindex der Schleife und dem berechneten Spaltenindex kannst Du jetzt die Zahl in das Feld eintragen. Nämlich an der Position <Listenindex>/<Spaltenindex>.
Natürlich musst Du das Feld irgendwann wieder bereinigen, damit beim nächsten Durchlauf keine alten Zahlen mehr drinstehen.
-
darkpandemic schrieb:
...
das siehst Du durchaus richtig. Aber Du brauchst Dir die Ergebnisse der Rechnungen ja nicht dauerhaft in einer Liste zu merken. Die Zeile des Feldes, in das Du die Zahl schreiben musst kennst Du ja bereits, da das ja Dein aktueller Listenindex ist. D.h. das erste Element der Liste (Elementindex = 0) muss irgendwo in der ersten Zeile (Zeilenindex = 0) eingetragen werden, das zweite Listenelement (Elementindex = 1) muss irgendwo in der zweiten Zeile (Zeilenindex = 1) eingetragen werden, ..., das n+1-te Listenelement (Elementindex = n) muss irgendwo in der n+1-ten Zeile (Zeilenindex = n) eingetragen werden.
Was Du berechnen musst ist dann der zugehörige Spaltenindex. Dazu reicht es aber aus eine Integervariable zu verwenden. Da man das Ergebnis der Division aber auch benötigt um festzustellen ob der Sortiervorgang abgeschlossen ist solltest Du besser gleich zwei verwenden. Die erste nennst Du z.B. 'quotient' und weist ihr das Ergebnis von der Division des Listenelementes mit Deinem Divisor zu. Die zweite nennst Du dann z.B. 'spaltenindex' und weist ihr den Wert des Quotienten Modulo 10 zu. Mit Hilfe des Elementindex der Schleife und dem berechneten Spaltenindex kannst Du jetzt die Zahl in das Feld eintragen. Nämlich an der Position <Listenindex>/<Spaltenindex>.
Natürlich musst Du das Feld irgendwann wieder bereinigen, damit beim nächsten Durchlauf keine alten Zahlen mehr drinstehen.
Lieben dank, hab es inzwischen hinbekommen :)
Thema kann geschlossen werden :D -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage