Alle true Werte eines boolean Arrays herausfiltern

Alucardd

Mitglied
Hey Leute,

suche seit einiger Zeit nach einer Lösung hierfür. Auch hier im Forum habe ich leider nichts dazu finden können.

Also ich habe ein boolean Array und möchte diesen auf alle, sich darin befindlichen, "true" Werte überprüfen und diese dann separat abspeichern. Am besten in einem array damit ich einen davon mit einem randomInteger anwählen kann.

hier mein Ansatz:
Java:
[......]

For (int i =0;i<array.length;i++) {
         If (array == true) {
              variableFürPosition = i;
               i=0;

Ich weiß wie ich mit einer for Schleife mein Array auf einen Wert durchsuche. Aber sobald ein Wert mit true gefunden wurde, endet die Schleife und alle Werte danach werden ignoriert. Wenn ich mein int im body am Ende auf 0 setze damit die Schleife von vorne beginnt macht er das zwar immer wieder aber hört ja auch immer wieder am selben Array auf bevor er die anderen prüfen kann. Dabei möchte die Position jedes true Wertes kennen damit ich einen davon zufällig anwählen kann.

Wäre super wenn mir jemand helfen könnte.

Danke im voraus.


Mfg
Alu
 
Zuletzt bearbeitet:
Bitte verwende Code-Tags (die drei Punkte neben dem Smiley), sonst wird dein Code nicht richtig angezeigt (z.B. werden die eckigen Klammern falsch interpretiert).

Ansonsten: Du musst deine gefundenen Positionen natürlich in einem zweiten Array (besser, ArrayList, weil dynamisch) speichern, wenn es sich um mehrere zu speichernde Daten handelt.
 
Bitte verwende Code-Tags (die drei Punkte neben dem Smiley), sonst wird dein Code nicht richtig angezeigt (z.B. werden die eckigen Klammern falsch interpretiert).

Ansonsten: Du musst deine gefundenen Positionen natürlich in einem zweiten Array (besser, ArrayList, weil dynamisch) speichern, wenn es sich um mehrere zu speichernde Daten handelt.

Habe es geändert.

Listen hatten wir leider noch nicht und ich bin mir nicht sicher ob wir die benutzen dürfen.

Wenn ich ein Array für die Positionen erstelle, muss ich ja wissen wie groß das Array sein muss. Aber die Anzahl an true Werten ist variabel(sorry das hatte ich vergessen in meinem Post). Also es kann sein, dass der erste Wert "true" ist und alle andern "false" oder aber auch 2 "true" und 2 "false" etc.
 
Habe es geändert.

Listen hatten wir leider noch nicht und ich bin mir nicht sicher ob wir die benutzen dürfen.

Wenn ich ein Array für die Positionen erstelle, muss ich ja wissen wie groß das Array sein muss. Aber die Anzahl an true Werten ist variabel(sorry das hatte ich vergessen in meinem Post). Also es kann sein, dass der erste Wert "true" ist und alle andern "false" oder aber auch 2 "true" und 2 "false" etc.

Da fehlt noch der Index in der if-Bedingung.

Da gibt es mehrere Möglichkeiten:

  1. Zähle zuerst alle true-Werte, dann kannst du das Ergebnis-Array erstellen und in einer zweiten Runde die Werte einfügen.
  2. Erstelle ein Ergebnis-Array, dass genauso groß ist wie das Ausgangsarray, zähle gleichzeitig wieviele Werte es enthält und kopiere die Werte am Ende in ein drittes Array.
  3. Bau dir eine Klasse für ein dynamisches Array, das sich selbst vergrößert. Ich schätze mal diese Lösung fällt aus, bei deinem Kenntnisstand.
 
Also ich habe ein boolean Array und möchte diesen auf alle, sich darin befindlichen, "true" Werte überprüfen und diese dann separat abspeichern.

Noch einmal zur Klarstellung: Möchtest du die true-Werte speichern (was recht sinnlos ist) oder möchtest du den Index speichern, an dessen Stelle im Ausgangsarray sich ein true-Wert befindet?
 
Das habe ich übersehen. Muss wohl beim kopieren iwie verloren gegangen sein. Kann es jetzt aber nicht mehr ändern da 30min vorbei sind.

Die erste Variante die du vorgeschlagen hast war auch mein Plan. Nur weiß ich nicht wie ich die "true" Werte zählen soll.
Das hab ich mit meiner for schleife versucht aber damit bekomme ich nur den ersten "true" wert den er erwischt.
 
Nur weiß ich nicht wie ich die "true" Werte zählen soll.

Naja, man zählt indem man eine Zählvariable z.B. vom Typ int um 1 erhöht, wenn ein passendes Element gefunden wurde.

Java:
int zaehler;
for (int i = 0; i < array.length; i++) {
    if (array[i]) {
        // hier zählen
    }
}
 
Zuletzt bearbeitet:
D
Naja, man zählt indem man eine Zählvariable z.B. vom Typ int jeweils um 1 erhöht, wenn ein passendes Element gefunden wurde.

Java:
int zaehler;
for (int i = 0; i < array.length; i++) {
    if (array[i]) {
        // hier zählen
    }
}

Danke dir. Weiß nicht warum ich da nicht drauf gekommen bin nen int Zähler zu erstellen..
Kann aufjedenfall wieder weiterarbeiten erst mal 🙂
 
Wenn es nur darum geht, am Ende eines der Elemente zufällig herauszupicken und Du das Mehr an Speicher verkraften kannst, kannst Du Dir das Zählen vorab auch sparen. Dazu machst Du Dein int-Array so groß wie Dein boolean-Array und zählst während des Füllens einfach mit.
 
Wenn es nur darum geht, am Ende eines der Elemente zufällig herauszupicken und Du das Mehr an Speicher verkraften kannst, kannst Du Dir das Zählen vorab auch sparen. Dazu machst Du Dein int-Array so groß wie Dein boolean-Array und zählst während des Füllens einfach mit.

Ich hab jetzt meinen Code soweit fertig aber er macht nicht das was ich möchte.

Vielleicht zum allgemeinen Verständnis:
ich soll in einem Pac-Man Spiel den comp1 programmieren der zuerst alle Richtungen um sich herum prüft (also ob sie durch eine Wand versperrt werden oder nicht) und dann in eine der freien Richtungen geht. Die Wahl der freien Richtung soll zufällig sein.

ich vermute dass mein Fehler in diesem code Abschnitt liegt:
[….]

Java:
for(int i=0;i<moeglicheRichtung.length;i++) {
            if (moeglicheRichtung[i] == true) {
                indexPosition[zaehler] = i;
            }
}

Hier will ich ein Array (indexPosition) mit den index Nummern des Arrays(möglicheRichtung) bei denen moeglicheRichtung = "true" ist füllen. Also mit den Richtungen die nicht versperrt sind.
(in zaehler ist die anzahl der Richtungen die nicht versperrt sind, also die größe meines indexPosition Arrays)

Ich vermute dass indexPosition[zaehler] nicht bei jedem durchgang seinen index wechselt...

Ich habe die Aufgabe allgemein vermutlich viel komplizierter gemacht als sie ist aber generell sollte der Rest stimmen.
 
Stimmt! hab es jetzt so:

Code:
for(int i=0;i<moeglicheRichtung.length;i++) {           
            if (moeglicheRichtung[i] == true) {               
                indexPosition[zaehler] = i;
                zaehler ++;
            }
        }

bin mir gerade nur nicht sicher ob indexPosition[zaehler] im ersten durchlauf auch 0 ist. Ist das so?
 
Stimmt! hab es jetzt so:

Code:
for(int i=0;i<moeglicheRichtung.length;i++) {       
            if (moeglicheRichtung[i] == true) {           
                indexPosition[zaehler] = i;
                zaehler ++;
            }
        }

bin mir gerade nur nicht sicher ob indexPosition[zaehler] im ersten durchlauf auch 0 ist. Ist das so?

Die Frage lässt sich mit dem gegebenen Code nicht beantworten, weil man nicht sieht, was vorher mit "zaehler" passiert:
int zaehler = 5; // Zähler ist nicht Null 😉

Edit:

int zaehler; reicht aus, um eine mit 0 initialisierte Integervariable zu deklarieren, aber man kann es auch noch klarer formulieren mit: int zaehler = 0;. Damit drückt man für sich (oder andere Leser des Codes) direkt aus, dass man hier eine Variable deklarieren möchte und zwar explizit mit 0 initialisiert. Das kann die Lesbarkeit verbessern.
 
Zuletzt bearbeitet:
Die Frage lässt sich mit dem gegebenen Code nicht beantworten, weil man nicht sieht, was vorher mit "zaehler" passiert:
int zaehler = 5; // Zähler ist nicht Null 😉

Edit:

int zaehler; reicht aus, um eine mit 0 initialisierte Integervariable zu deklarieren, aber man kann es auch noch klarer formulieren mit: int zaehler = 0;. Damit drückt man für sich (oder andere Leser des Codes) direkt aus, dass man hier eine Variable deklarieren möchte und zwar explizit mit 0 initialisiert. Das kann die Lesbarkeit verbessern.


ich war gerade verwirrt weil ich dachte ich muss die gleiche variable (zaehler) die ich zum initialisieren des arrays indexPosition benutzt habe hier auch in der for schleife benutzen. Aber eigentlich kann ich es ja auch einfach so machen oder?

Java:
int b = 0;
       
        for(int i=0;i<moeglicheRichtung.length;i++) {          
            if (moeglicheRichtung[i] == true) {              
                indexPosition[b] = i;                  
                b ++;
            }
        }

habe einfach eine neue variable gemacht für das hochzählen des index von indexPosition. b kann ja maximal nur so hoch sein wie meine variable "zaehler".

Danke für die hilfe euch beiden 🙂
allerdings macht mein Code immer noch nicht das was ich möchte.. also der comp1 bewegt sich eigentlich überhaupt nicht. Aber dazu müsste man meinen ganzen Quelltext für comp1 einsehen nehme ich an. Den kann ich aber hier nicht posten leider wegen dem prüf-system meiner uni.
 
Eine Alternative, auch wenn das definitiv keine für Anfänger ist:

Java:
boolean[] bools = { true, true, false, false, true, false, true, false };
int[] ints = IntStream.range( 0, bools.length ).filter( index -> bools[ index ] ).toArray();
System.out.println( Arrays.toString( ints ) );
 
Sowas darf ich leider nicht benutzen hier aber trotzdem danke für den Vorschlag.

Ich glaube aber dass der Fehler in meinem Quelltext wo ganz anders liegt.
Stehe extrem auf dem Schlauch und weiß nicht mehr was ich machen soll.
Ich habe meines Wissens nach alles so programmiert wie es sein sollte und ich habe meinen Quellcode mehrfach auf Fehler überprüft aber finde einfach nichts. Bei der Syntax wird mir auch kein Fehler angezeigt und trotzdem bewegt sich mein Pac-Man Geist nicht wenn ich das Programm starte.
Das einzige was mir jetzt noch eingefallen ist, dass ich hier vielleicht jemanden finde der kurz über meinen Code schauen möchte. Wenn jemand Interesse hat schreib mich bitte an oder antworte hier.
Würde den Quellcode dann per Messenger schicken.
 
Also ich habe ein boolean Array und möchte diesen auf alle, sich darin befindlichen, "true" Werte überprüfen und diese dann separat abspeichern. Am besten in einem array damit ich einen davon mit einem randomInteger anwählen kann.

ich versteh nicht, was du mit "abspeichern" meinst - was willst du speichern? lauter trues?
du willst die Positionen speichern
Code:
bool[] arr = ... hier das boolean Array
int zaehler;
int[] ergebnis = int[arr.length]; // eine Liste wäre schöner -> List<Integer> ergebnis = new ArrayList<>();
int e = 0;
for (int i = 0; i < arr.length; i++){
    if (arr[i]){
        ergebnis[e] = i;
        e++;
    }
}

Dann hast du in ergebnis alle Positionen des ursprünglichen Arrays, an denen true-werte liegen. und kannst dir die holen. Mit einer Liste ist es schöner. Und du kannst es auch noch hübscher machen, und das ergebnis Array kleiner gestalten...
 

Zurück
Oben