Forum: PC-Programmierung Java - eindimensionales Array zu zweidimensionales


von Stev (Gast)


Lesenswert?

Hallo Leute,

versuche mich gerade an einer Funktion, die ein eindimensionales Array 
als Argument übergeben bekommt, als Rückgabewert aber "möglichst 
quadratisch" ein 2 dimensionales Array daraus rückgeben soll.

Leider weiß ich momentan nicht weiter.

Der Fehler liegt laut Eclipse bei "test[a]
1
=input[i];" da die Meldung "exceptionoutofbound:10" liegt.
2
3
Hier der code
4
5
[c]
6
7
public static int[][] convertArrayTo2D(int[] input) 
8
  {
9
    int [][]test = new int[50][50];
10
    int i=0;
11
    int seitenlaenge = (int)sqrt(input.length);
12
    boolean gerade;
13
    
14
    
15
    if((sqrt(input.length)%2) == 0)        // überprüft, ob Arraylaenge gerade oder ungerade ist.
16
    {
17
      gerade = true;
18
    }
19
    else
20
    {
21
      gerade = false;
22
    }
23
    
24
    if(gerade==true)
25
    {
26
      
27
      for (int a = 0; a < seitenlaenge; a++)
28
      {
29
        for (int b = 0; b < seitenlaenge; b++)
30
        {
31
          i++;
32
          test[a][c]=input[i];
33
          
34
        }
35
      }
36
    }
37
    else
38
    {
39
      for (int a = 0; a < seitenlaenge; a++)
40
      {
41
        for (int b = 0; b < seitenlaenge+1; b++)
42
        {
43
          i++;
44
          test[a][c]=input[i];
45
        }
46
      }
47
    }
48
    
49
     return test;
50
  }


Vielen Dank

von Stev (Gast)


Lesenswert?

sorry, die Zählvariable "c" ist normalerweise "b", aber das Forum hat 
dies als Fehler ("Spam") angekreidet, deshalb habe ich es ändern müssen.

von gassit (Gast)


Lesenswert?

Das "i++" in den Schleifen mit der jeweils darunterstehenden 
vertauschen. Im letzten Durchlauf wird auf input[10] zugegriffen. Das 
Array hat aber nur Indices von 0 bis 9.

von Stev (Gast)


Lesenswert?

Ok,

habe das i++ nun unter die "test[a][c]=input[i];" geschrieben.

Allerdings besteht der Fehler immer noch, weiß nicht, wie er auf den 
Index 10 zugreift, obwohl doch die Abbruchbedingung in der Schleife 
stimmt oder?!


Danke

von AVR-Frickler (Gast)


Lesenswert?

Der Fehler liegt wieder einmal beim Programmierer!

Du nimmst als Ausgangsarray ein Array mit 9 Feldern! (Ja meine Glaskugel 
habe ich gerade geputzt)

Wurzel von ist 3, 3 ist eine ungerade Zahl.

also läuft a von 0 bis 2 macht 3 Durchläufe, b läuft von 0 bis 3 das 
sind 4 Durchläufe.
Folglich läuft i von 0 bis (3 * 4) - 1 macht 12 Durchläufe!

6 setzen!

von AVR-Frickler (Gast)


Lesenswert?

AVR-Frickler schrieb im Beitrag #1925502:
> Wurzel von ist 3, 3 ist eine ungerade Zahl.

Sollte heißen
Wurzel von 9 ist 3, 3 ist eine ungerade Zahl.

Hmm ich sollte mich mal anmelden, dann könnte man auch editieren. :P

von huhu (Gast)


Lesenswert?

i < input.length in die Abbruchbedingung der zweiten Schleife?

von Michael (Gast)


Lesenswert?

AVR-Frickler hat recht!

i wird viel zu hoch gedreht.
Wenn Du die B-Schleife verlässt musst Du i wieder 0 setzen.

von Karl H. (kbuchegg)


Lesenswert?

huhu schrieb:
> i < input.length in die Abbruchbedingung der zweiten Schleife?

Du ratest rum.

Mal dir die Situation auf

Bei einem Eingangsarray mit 9 Feldern, verteilst du die 9 Elemente wie 
auf dein 2-D Array?

Wenn du es nicht durchschaust dann mal es dir auf und spiel selber 
Computer und geh deinen Code Schritt für Schritt durch.


Das ist das eine.
Das andere ist deine Berechnung der Grösse des 2D Arrays.

Ein Array mit 10 Feldern lässt sich nun mal nicht in ein 3*4 Array 
einpassen.  Denn ein 3*4 Array hat nun mal 12 Felder und nicht 10
Wenn die 10 Felder möglichst quadratich in ein 2D-Feld eingepasst werden 
sollen und das 2D Array kein Element zuviel oder zuwenig haben soll, 
dann ist das am besten passende Array ein 2*5 Array. Das mag dir 
gefallen oder nicht. Musst du entscheiden.

von Karl H. (kbuchegg)


Lesenswert?

Michael schrieb:
> AVR-Frickler hat recht!
>
> i wird viel zu hoch gedreht.
> Wenn Du die B-Schleife verlässt musst Du i wieder 0 setzen.

Quatsch

von D. I. (Gast)


Lesenswert?

Du solltest daran denken dass hier auch AuD-Tutoren/Dozenten lesen und 
fertig gepastete Codes im Plagiatschecker landen, ...

Das sieht nämlich sehr nach der letzten Übungsaufgabe aus die zu tun ist 
;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.