In Java bestimmte Werte aus einem Array in Indexvariable eines neuen Arrays speichern?

2 Antworten

int first = feld2[0];
int last = feld2[feld2.length - 1];

So klappt das nicht, denn die Variablen enthalten jetzt das erste und letzte Element von feld2. Der Wert ist aber uninteressant, weil Du dort noch gar nichts gespeichert hast. Was Du brauchst, sind diese Positionen, also nur der Index:

int first = 0;
int last = feld2.length - 1;

Und diese Stellen in feld2 musst Du befüllen, also

feld2[first] = feld[i]; // statt first = feld[i]
...
feld2[last] = feld[i];  // statt last = feld[i]
ralphdieter  03.10.2023, 23:16

Die Variablen count und right brauchst Du gar nicht. Ändere stattdessen nach jedem Einfügen direkt die entsprechende Position (first++ oder last--)

0
MrPotatoman 
Fragesteller
 04.10.2023, 10:28

okay vielen Dank jetzt versteh ichs

0

Verstehe ich das richtig, dass die Zahlen einfach nach Vorzeichen sortiert werden sollen? Also erst alle negativen und dann alle positiven Werte, ohne Rücksicht auf die tatsächlichen Zahlen?

Du warst schon nah dran. Die Antwort von ralphdieter löst dein Problem. Der Code sieht dann so aus:

public static int[] verteilen(int[] feld){
    int[] feld2 = new int[feld.length];
    int first = 0;
    int last = feld2.length - 1;

    for(int i=0;i<feld.length;i++) {
        if(feld[i] < 0) {
            feld2[first] = feld[i];
            first++;
        }
        else {
            feld2[last] = feld[i];
            last--;
        }
    }
    return feld2;
}

Ich würde dir noch empfehlen, dass du die Variablennamen ein wenig anpasst. Einerseits solltest du nicht deutsche und englische Bezeichnungen durcheinanderwerfen, andererseits würde ich anstatt "feld2" z.B. den Namen "ergebnis" oder so nehmen, damit man gleich sieht wofür die Variable gut ist. (Wobei der vorgegebene Code in der Hinsicht noch schlimmer ist, als deiner, von daher brauchst du dir in der Schule wahrscheinlich noch keine Gedanken darum machen)

Ich bevorzuge bei solchen Aufgaben immer Streams, weil ich sie durch die Funktionsnamen übersichtlicher finde, als Funktionen mit geschachtelten Schleifen und ifs:

public static int[] verteilen(int[] feld) {
    return Arrays
        .stream(feld)   // Wir streamen die Zahlen
        .boxed()        // und wandeln sie erstmal in Integer-Objekte um 
                        //(damit man nach anderen Kriterien als dem Zahlenwert sortieren kann)
        .sorted(Comparator.comparing(Integer::signum)) // sortieren sie nach Vorzeichen
        .mapToInt(Integer::intValue) // wandeln sie sie wieder zurück in int-Werte
        .toArray();     // und machen ein Array draus, was zurückgegeben wird
}
MrPotatoman 
Fragesteller
 04.10.2023, 10:31

Okay danke fuer die Hilfe, wir duerfen die Aufgaben halt leider nur mit den Sachen loesen die wirs bis jzt in der Vorlesung hatten.

0
ralphdieter  04.10.2023, 21:00

Ich habe auch zuerst an Streams gedacht, schon bei fuellen() via

return Random.ints(n, a, e).toArray();

Für die Funktion verteilen() reicht sogar

return IntStream.of(feld).sorted().toArray();

Aber erfahrungsgemäß basieren solche Übungsaufgaben auf Java 1.7 oder schlimmer, und man muss die Lösung auf einer 3.5"-Diskette abgeben. Es wäre ja auch zu viel verlangt, wenn sich ein Informatiklehrer mit dem neumodischen Zeug von vor 20 Jahren auseinandersetzen müsste!

0