kostenloser Webspace werbefrei: lima-city


Arrays überschreiben und erzeugen

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    kill-a-teddy

    Kostenloser Webspace von kill-a-teddy

    kill-a-teddy hat kostenlosen Webspace.

    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);
    		}
    
    	}
    
    }
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    kill-a-teddy schrieb:
    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. :/
    Kannst du das bitte mal "händisch" "vorzeigen", damit wir wissen was das Programm machen soll?

    So kann ich es mir jedenfalls noch nicht vorstellen (eventuell liegts auch an der Müdigkeit, das kann ich dir nicht sagen).
  4. Autor dieses Themas

    kill-a-teddy

    Kostenloser Webspace von kill-a-teddy

    kill-a-teddy hat kostenlosen Webspace.

    hackyourlife schrieb:
    kill-a-teddy schrieb:
    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. :/
    Kannst du das bitte mal "händisch" "vorzeigen", damit wir wissen was das Programm 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...
  5. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    kill-a-teddy schrieb:
    Sobald die schleife dann abgearbeitet ist, erhöht sich dann x und wird von 10 zu 100...
    Und dann? Wie geht das dann weiter?
  6. Autor dieses Themas

    kill-a-teddy

    Kostenloser Webspace von kill-a-teddy

    kill-a-teddy hat kostenlosen Webspace.

    hackyourlife schrieb:
    kill-a-teddy schrieb:
    Sobald die schleife dann abgearbeitet ist, erhöht sich dann x und wird von 10 zu 100...
    Und dann? Wie geht das dann weiter?


    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
  7. 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
  8. Autor dieses Themas

    kill-a-teddy

    Kostenloser Webspace von kill-a-teddy

    kill-a-teddy hat kostenlosen Webspace.

    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
  9. 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
  10. Autor dieses Themas

    kill-a-teddy

    Kostenloser Webspace von kill-a-teddy

    kill-a-teddy hat kostenlosen Webspace.

    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
    int[] liste = { 56410, 94032, 83512, 90459, 53419 };
    gibt also aus
    0,2,2,9,9
    . Deshalb bekomme ich jedesmal eine Index out of Bunds exception, wenn ich das durch die If-Schleifen jage...
    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...
  11. 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.:confused:
    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.
  12. Autor dieses Themas

    kill-a-teddy

    Kostenloser Webspace von kill-a-teddy

    kill-a-teddy hat kostenlosen Webspace.

    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.:confused:
    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 ^^
  13. Hallo kill-a-teddy,

    kill-a-teddy schrieb:
    ...
    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?
    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.
  14. Autor dieses Themas

    kill-a-teddy

    Kostenloser Webspace von kill-a-teddy

    kill-a-teddy hat kostenlosen Webspace.

    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
  15. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!