Frage von ColaPina, 5

Array programmieren in Java?

Hallo, ich habe eine eigentlich sehr simple Programmieraufgabe, aber aus irgendeinem Grund funktioniert es nicht. Mein Programm soll die negativen Zahlen eines Arrays zurückgeben, aber leider erhalte ich immer nur dreimal die letzte Negative Zahl des Testarray (in diesem -7). Aber wieso? Ich weiß gerade nicht ob ich einfach ein Brett vor dem Kopf habe oder es viel komplizierter ist als ich dachte, aber ich bedanke mich schonmal bei jedem der versucht mir aus diesem mentalen Disaster zu helfen.

public class Testat_2 {

public static void main(String[] args) { int [] b = new int[]{-1, 2, -3, 4, -5, 6, -7, 8}; b = ReturnNegatives(b); for (int i = 0; i < b.length; i++) { System.out.print(b[i]); } }

public static int[] ReturnNegatives ( int [] a )
{
    int s = -1;
    for (int i = 0; i < a.length; i++)
    {
    if ( a[i] < 0)
    {
        s+=1;
    }
    }
    
     int [] x = new int[s];
    for (int c = 0; c <  a.length; c++)
    {
    if ( a[c] < 0)
    {
        for (int j = 0; j < s; j++)
        {
        x[j]=a[c];
        }
    }
    }
    
    return x;
    
     
} 

}

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von PerfectMuffin, 4

1. Warum initialisierts du s mit -1?

2. Die zweite for-Schleife ist außerhalb vom Scope der ersten, du darfst i also wieder verwenden.

3. deine Schleife

for (int j = 0; j < s; j++)
{
x[j]=a[c];
}

Füllt x immer komplett mit der zuletzt gefundenen negativen Zahl, Endergebnis ist, dass du nur die letzte negative Zahl so oft siehst, wie du negative Zahlen im Array hast(-1).

Kommentar von ColaPina ,

Ja das mit dem j und der -1 habe ich nach einiger Zeit mal aus Verzweiflung geändert, aber wieso wird denn der Array x komplett mit der letzten negativen Zahl gefüllt, dafür ist ja die zweite for schleife (mit j) um das zu verhindern...

Kommentar von PerfectMuffin ,

Die innere for-Schleife erzeugt genau dieses Problem.

Bedenke dabei, dass bei der äußeren for-Schleife pro Iteration nicht eine Iteration der inneren for-Schleife, sondern jedes mal die gesammte Schleife ausgeführt wird.

Allein stehend bedeutet

for (int j = 0; j < s; j++)
{
x[j]=a[c];
}

"Fülle s Elemente des Array x mit dem durch den Wert von c als Index vorgegebenen Wert in a".

Innerhalb der inneren for-Schleife ist c also konstant.

Kommentar von ColaPina ,

Ok danke, das Problem verstehe ich, jetzt fehlt mir noch die Lösung aber das sollte ich hinbekommen. :)

Kommentar von PerfectMuffin ,

Viel Erfolg.

Kommentar von ColaPina ,

ok jetzt klappt es :)

if ( a[c] < 0)
{
x[g]=a[c];
g++;
}

Kommentar von TUrabbIT ,

sehr gut.

Antwort
von TUrabbIT, 4

Das Problem liegt in der letzten Inneren Schleife, deren angedachten Zweck ich nicht ganz durchblicke.
Hier nimmst du das gefunde Element a[c] und schreibst es in alle Felder von x, und das für jedes gefundene Element c.
Somit kann in dem Array nicht mehr stehen als die letzte gefundene negative Zahl.

Um die Position in den x Array zu finden solltest du dir einfach einen weiteren Index z.B. j machen der mit 0 initialisiert und für jedes gefundene Element erhöht wird (in der if statt der Schleife)

Antwort
von DexterNemrod, 5

Gewöhn dir am besten gar nicht erst an, immer so kurze Variablennamen zu verwenden - du verwendest vermutlich eine IDE und kannst daher eine Autovervollständigung nutzen - beschreibende Namen sind da hilfreicher. Natürlich ist nichts gegen einen Schleifenzähler namens i einzuwenden, aber wenn du überall nur kryptische Variablennamen verwendest ist es für andere (und dein zukünftiges Ich) ungescheit schwer, durch den Code durchzusteigen.

Denk immer daran: Du musst den Code nur einmal schreiben, aber beliebig oft lesen.

Dein Problem liegt in der zweiten schleife - durch die Verschachtelung befüllst du immer das Array mit der gefundenen Negativen zahl - wobei die zuletzt gefundene natürlich alle anderen überschreibt. Verwende statt der inneren Schleife einen zähler, den du zu beginn auf 0 setzt. Anschließend iteriere über das input-array. Wann immer eine negative Zahl findest, schreibe diese ins Ergebnisarray und inkrementiere dann den Zähler.

Wenn du das tust wirst du feststellen, dass du eine ArrayIndexOutOfBoundsException erhältst was daran liegt, dass dein Ergebnisarray um 1 zu klein sein wird. Das liegt daran dass du beim erstellen eines Arrays dessen Länge angibst und nicht den maximalen index.

Antwort
von Myrmiron, 4

Dein Problem ist das du erst die Zahl fragst ob sie negativ ist, und dann das gesamte Array mit dieser Zahl füllst.

Ich würde es folgendermaßen machen:

  //Befüllschleife
int laufvariable = 0;
for (int i = 0; i < a.length; i++){
if(a[i] < 0){
  x[laufVariable] = a[i];
laufvariable ++;
}
}return x;


Außerdem werden Methodennamen klein geschrieben!

Edit: Gott, das ist das letzte mal das ich auf dieser Seite versuche Code zu schreiben, was ein Albtraum!

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten