Iteratorform und Methode mit variabler Parameterzahl

luluuxs

Aktives Mitglied
Hallo zusammen,
das Thema ist für mich neu, und meine Aufgabe ist es, nur an der Methode sum() etwas zu ändern, wie ich es schon versucht habe,
aber ich weiß nicht, was ich ändern muss, damit es funktioniert, beziehungsweise, wo mein Denkfehler liegt. Hat jemand eine Idee für mich?
LG

[CODE lang="java" title="Adder"]class Adder {

static int sum(int[] ... values) {
int result = 0;
for (int sum: values) {
result += sum;
}
return result;
}

static int[] initArray(int n) {
int[] a = new int[n];
for (int i = 0; i < a.length; ++i) {
a = i;
}
return a;
}

public static void main(String[] args) {
int[] a = initArray(10);
int[] b = initArray(10);
int[] c = initArray(10);
int sumABC = sum(a, b, c);
int sumAB = sum(a, b);
Out.println("sumABC = " + sumABC);
Out.println("sumAB = " + sumAB);
}
}[/CODE]
 
Naja, ueberlege mal was genau du da machst:

1. Du legst die Variable "result" an.
2. Dann beginnt die Schleife, fuer jeden Wert "sum" in der Liste "values".

Und dann innerhalb der Schleife machst du:

1. "sum" mit sich selbst addieren und dann wieder "sum" zuweisen.
2. "sum" auf "result" zuweisen.

Loesen wir die Schleife mal haendisch auf fuer die Werte "1, 2, 3":

Java:
// Erste Iteration; Wert "1"
sum = sum + sum;
//     1  +  1
result = sum;
//        2

// Zweite Iteration; Wert "2"
sum = sum + sum;
//     2  +  2
result = sum;
//        4

// Dritte Iteration; Wert "3"
sum = sum + sum;
//     3  +  3
result = sum;
//        6

Ergebnis davon? "result" ist auf den letzten Wert mal Zwei gesetzt.

Dein Verstaendnisproblem ist vermutlich das "sum" keine "globale" Variable ist, sondern nur innerhalb der Schleife existiert, und bei jedem Durchlauf neu gesetzt wird. Dazu traegt auch bei dass dir Variable ueberhaupt "sum" heiszt, die sollte richtiger "value" heiszen, dann waere dir das vermutlich direkt aufgefallen:

Java:
    static int sum(int[] values) {
        int result = 0;
        for (int value : values) {
            value += value;
            result = value;
        }
        return result;
    }

Und ploetzlich sieht man, der Code ergibt so irgendwie gar keinen Sinn mehr. Du musst natuerlich den Wert zum "result" dazuzaehlen.



Ein letztes Wort am Rande, += ist in Java *nicht* kurz fuer a = a + b, sondern ist mit einer Umwandlung behaftet zum Zieltypen TYPE_OF_A a = (TYPE_OF_A)(a + b). Die Umwandlung kann leise Fehler schlucken, zum Beispiel:

Java:
int a = 5;

a += 5; // a == 10, alles gut.
a = a + 5.345; // Kompilierfehler, da das Ergebnis von "double" nicht in "int" passt.
a += 5.345; // a == 10, das "double" Ergebnis wird still nach "int" konvertiert.

// Letzte Operation entspricht:
a = (int)(a + 5.345);
 
Zuletzt bearbeitet:
Deine Method sum bekommt eine beliebige Anzahl Integer. Aber was versuchst Du denn zu übergeben? Du übergibst ja keine Integer sondern Arrays!

Also must Du die Parameter so ändern, dass Du nicht einzelne Integer sondern Integer Arrays übergeben bekommst.
 
@Robert Zenz
Ich glaube Du hast nicht richtig geschaut - er hat nur blöde bezeichner, aber er summiert ja alles in result auf. Die einzelnen Zahlen in der foreach nennt er sum - das ist natürlich ungeschickt, aber ändert nichts an der Tatsache, dass dies so erst einmal korrekt aufsummiert.
 
Deine Method sum bekommt eine beliebige Anzahl Integer. Aber was versuchst Du denn zu übergeben? Du übergibst ja keine Integer sondern Arrays!

Also must Du die Parameter so ändern, dass Du nicht einzelne Integer sondern Integer Arrays übergeben bekommst.
Ich habe natürlich auch nicht richtig geschaut - der Parameter ist ja auch schon int-Array. Aber dann musst man natürlich in einer Schleife alle int Arrays durchgehen um dann jedes einzelne int Array aufzusummieren.
 
Sollte dieses int sum(int[] ... values) { nicht int sum(int... values) { heißen. Sonst müssten ja ein oder mehrere int-Arrays als Parameter übergeben werden.
 
Deine Method sum bekommt eine beliebige Anzahl Integer. Aber was versuchst Du denn zu übergeben? Du übergibst ja keine Integer sondern Arrays!

Also must Du die Parameter so ändern, dass Du nicht einzelne Integer sondern Integer Arrays übergeben bekommst.
Sie bekommt doch eine beliebige Anzahl an Arrays oder nicht? Im Methodenkopf steht doch, "int[] ... values" und nicht "int ... values"
 
Sie bekommt doch eine beliebige Anzahl an Arrays oder nicht? Im Methodenkopf steht doch, "int[] ... values" und nicht "int ... values"
Aber ist es das, was du möchtest?

Dann musst du den Code innerhalb der Methode natürlich anpassen. Im Prinzip übergibst du damit ein Array von Arrays.
Java:
int sum(int... values)
   
// ist (fast) identisch mit
   
int sum(int[] values)
 
Einfache Grundlage der Varargs in Java:

Du hast als Parameter AnyType... something
Dann hast Du in der Methode something vom Typ AnyType[]

Bei einem int... bedeutet dies: int[]
bei einem int[]... bedeutet dies dann int[][]

Damit hast Du den Typ in der Methode.

Somit hast Du ein Array von Arrays, das Du durchgehen kannst.
 
Einfache Grundlage der Varargs in Java:

Du hast als Parameter AnyType... something
Dann hast Du in der Methode something vom Typ AnyType[]

Bei einem int... bedeutet dies: int[]
bei einem int[]... bedeutet dies dann int[][]

Damit hast Du den Typ in der Methode.

Somit hast Du ein Array von Arrays, das Du durchgehen kannst.
Das Problem habe ich verstanden, vielen Dank, aber da die Iteratorform für mich komplett neu ist, weiß ich nicht, wie ich das "Durchgehen" jetzt umsetzen kann, also wie ich den Array mit den Arrays durchgehe und dann jedes Array im Array erneut (dort aufsummieren) und dann komplett die Summen der Arrays im Array aufsummiere
 
Java:
for (int value : values) {
Das dürfte nicht kompilieren, da es sich ja bei "values" um ein Array von Arrays handelt, ist der Typ von "value" nicht int, sondern int[].

Wenn "value" von Typ int[] ist, wie kommt man dann an die einzelnen Werte darin?
ja, wie ich gesagt hab, das spuckt mir auch den Fehler aus, aber ich weiß nicht wie ich es anders machen kann... :/
 
Java:
for (int value : values) {
Das dürfte nicht kompilieren, da es sich ja bei "values" um ein Array von Arrays handelt, ist der Typ von "value" nicht int, sondern int[].

Wenn "value" von Typ int[] ist, wie kommt man dann an die einzelnen Werte darin?
Ich würde sagen indem man value auch noch einmal durchgeht,
Dann die Werte aufsummiert, das für alle übergebenen int-Arrays macht und die Summen dann wieder aufsummiert
 
also das erste sieht nicht schlecht aus

Java:
value += value;
result = value;

aber nun kommen hier die Fehler und ja ich habe rumprobiert, aber ich finde keine Version ohne Fehler...
Das ist ja nur ein Teil des Codes. Wieviele Variablen mit dem Namen "value" hast du denn derzeit?

EDIT: Außerdem ist das jetzt wieder der völlig hirnrissige Code aus dem ersten Beitrag, zu dem @Robert Zenz ja schon einiges geschrieben hatte.
 
Das ist ja nur ein Teil des Codes. Wieviele Variablen mit dem Namen "value" hast du denn derzeit?
Java:
static int sum(int[] ... values) {
        int result = 0;
        for (int[] value : values) {
            result += value;
        }
        return result;
    }
ich habe derzeit einmal int[] value und einmal int value, aber wenn ich alle zu int[] value mache, passt dasauch nicht mehr
 
Java:
static int sum(int[] ... values) {
        int result = 0;
        for (int[] value : values) {
            for (int sum: value) {
                result += sum;
            }
        }
        return result;
    }
so? es funktioniert glaube ich, vielen Dank, ich dachte irgendwie die ganze Zeit, dass ich
die Summen der einzelnen Arrays nochmal aufsummieren muss, aber es wird ja alles schon auf result
addiert, danke
 
Aber irgendwie habe ich die Iterator-Variante noch immer nicht richtig verstanden...
Könntest du die vielleicht in einer Art Pseudo-Code erläutern ? Also was macht das vor und nach dem ":"?
 
Das ist die for each Schleife:

Generell hast Du auf der rechten Seite eine Collection oder Array und auf der Linken Seite deklarierst Du eine Variable mit dem Typ aus der Collection / dem Array.
 
Aber irgendwie habe ich die Iterator-Variante noch immer nicht richtig verstanden...
Könntest du die vielleicht in einer Art Pseudo-Code erläutern ? Also was macht das vor und nach dem ":"?
Das nennt man die "enhanced for-loop" oder "for-each-loop".

In Pseudocode würde man für for(int value : values) sagen: "Für jeden int-value in values mache das, was im Rumpf der Schleife steht."

Also eigentlich ganz einfach.
 
Zuletzt bearbeitet:

Zurück
Oben