Verständnisproblem mit void und int[]

Hallo ihr Lieben,

ich habe folgendes Problem. Wir sollen eine Prozedur schreiben die ein Array und zwei Zahlen i und j bekommt. Nun soll das Array am Index i den Wert von Index j erhalten und die restlichen Werte sollen um eins nach rechts rotiert werden. Ich habe die Funktion geschrieben und sie funktioniert auch. Hier mal der Code.

class Singleton{

 void rotate(int i, int j, int[] N){

 int[] temp = new int[N.length];

 for(int a=0; a 

In der nächsten Aufgabe, wird rotate(i, j, N); in einer Schleife mit der Laufvariable i verwendet. Da rotate aber mit void deklariert ist, ändert dieser Aufruf am Inhalt von N aber doch gar nichts. Also würde dieser Aufruf nur Sinn ergeben wenn ich rotate als Funktion, also mit Rückgabewert int[], deklariere und in der nächsten Aufgabe N = rotate(i, j, N); schreiben würde, oder Irre ich mich da?



Liebe Grüße Matthias

hallo

ein array wird in java ähnlich wie eine objektinstanz behandelt. objekte werden immer als referenz übergeben. wenn du also einer methode ein objekt oder einen array mitgibst, darf diese methode das objekt/array beliebig verändern. es ist also nicht notwendig, das ergebnis dieser manipulation wieder zurückzugeben.

beispiel:

void f() {
int[] a = new int[1];
a[0] = 1;
g(a);
System.out.println(a[0]);
}

void g(int[] b) {
b[0] = 2;
}

==> es wird der wert 2 ausgegeben

dementsprechend stellt sich natürlich die frage, ob es sinnvoll ist, einer anderen methode ein objekt zu übergeben, wenn die dann damit machen darf, was sie will. bei rein selbstgeschriebenen methoden ist das egal. schreibt man ein api, das andere verwenden sollen, geht man oft dazu über, vor dem aufruf einer fremden methode das objekt zu erst zu kopieren. dann kann die methode mit der kopie anstellen, was sie will - es beeinflusst nicht mein original.

lg

Hallo Erwin,

danke für deine schnelle Antwort. Ich wollte dir gerade antworten und fragen warum es bei mir trotzdem nicht geht, da ich dem temp-Array nicht nur eine neue Referenz zuordne sondern das Array schließlich mit N = temp.clone; so nach dem Motto

for(int b=0; b 
kopiere. doch irgendwie ist das dann doch nicht das gleiche habe ich gemerkt... Merkwürdig, ich war mir sicher, dass ich das bisher immer so gemacht habe, wenn ich Objekte vollständig kopieren wollte. Habe ich an der Stelle was falsch gemacht?


Liebe Grüße Matthias

Hi,

ich weiß nicht ob falsch, aber auf jeden Fall umständlich.

Prüfe i

1 Like

Hallo Lutz,

danke für deine Antwort, ich weiß was du meinst und ich gebe dir auch absolut recht, die Sinnvollste Methode ist es nicht :smile: aber ich bin froh wenn die Programme überhaupt laufen. Meist fehlt mir die Idee, wie ich die Aufgabe angehen soll.

Wenn ich deine Beschreibung richtig verstanden habe sollte das also in Java-Code so aussehen:

void rotate2(int i, int j, int[] N){
 int h1 = N[j];
 int h2 = N[i];

 for(int k = j; k 

Leider macht diese Prozedur nicht das was sie tun soll. Ich Probiers mal weiter, mit einer etwas Sinnvolleren Methode :smile:



Liebe Grüße Matthias

Hallo Lutz,

ich habs :smile:

void rotate2(int i, int j, int[] N){

 int temp = N[i];
 N[i] = N[j];

 for(int k=j; k \> i; k--){
 N[k] = N[k-1];
 }

 N[i+1] = temp;

}

So wird kein neuer Speicher vom Heap, für ein neues Array angefordert, da ich das alte Array einfach umschreibe. Dadurch muss ich auch kein anderes Array kopieren. :smile: Ich glaube das war auch deine Idee ich habe es nur falsch verstanden.
Danke schön nochmal. :smile:

Liebe Grüße Matthias

Hi Brayn,

mit void definierst DU nur, dass die Funktion selbst keinen Wert zurückgeben soll. Du kannst aber immer (wie schon beschrieben) Referenzen übergeben und dann wird an den Originalen von der Funktion rumgeändert, da sie ja die Adresse oder den Zeiger zu den Originalen übergeben bekommt. Das ist bei allen Variablen mit [] der Fall und bestimmt auch mehr, da hier nur eigentlich deren Startadresse übergeben wird.

Was aber keinen Sinn macht, ist in der Unterfunktion diesen Zeigerwert zu verändern (siehe letzten Zeile), da alle Werte/Zeiger aus der Unterfunktion nach deren Abschluss (return) nicht mehr zur Verfügung stehen. Du weist damit dann etwas zu, um es kurz danach wegzuwerfen. Änderungen an übergebenen Originalen sind aber natürlich nach Ausführen der Funktion noch valide und bleiben ausgeführt. :smile:

Gruß oldy