2013-09-05 11 views
5

Ho un array booleano le cui dimensioni dipendono dalla dimensione di una stringa selezionata casualmente.Come controllare TUTTI gli elementi di un array booleano sono veri

così ho qualcosa di simile:

boolean[] foundLetterArray = new boolean[selectedWord.length()]; 

Dato che il programma va avanti, questa particolare matrice booleana si riempie di valori veri per ogni elemento della matrice. Voglio solo stampare una dichiarazione non appena tutti gli elementi dell'array sono veri. Così ho provato:

if(foundLetterArray[selectedWord.length()]==true){ 
    System.out.println("You have reached the end"); 
} 

Questo mi dà un errore di eccezione fuori dai limiti. Ho anche provato il metodo ma questo termina il ciclo anche se 1 elemento nella matrice è vero. Ho bisogno di un ciclo for che iterates attraverso tutti gli elementi della matrice? Come posso impostare una condizione di test in questo?

+1

Gli indici di matrice iniziano da 0, quindi l'ultimo elemento è 'foundLetterArray [selectedWord.length() - 1]'. Anche '== true' è un po 'ridondante; non è necessario confrontare un valore di verità con un altro, ma è possibile utilizzarlo direttamente come condizione. – kiheru

+0

È necessario un ciclo per verificare se tutti gli elementi sono 'true'. Nel ciclo puoi fermarti quando incontri il primo elemento 'false'. – cyon

+0

Ciao ragazzi. Questo risolve il problema fuori limite, ma questa istruzione if presuppone che l'intero array sia vero se solo l'ultimo elemento è vero. Qualche idea su come aggirare questo? Per esempio se tutti gli elementi sono falsi e l'ultimo elemento è vero, si dice "Hai raggiunto la fine". È vero? o ho fatto qualcosa di sbagliato di nuovo? – Daybreak

risposta

10

Utilizzando la avanzato per ciclo, si può facilmente scorrere sopra un matrice, senza bisogno di indici e calcoli delle dimensioni:

private static boolean allTrue (boolean[] values) { 
    for (boolean value : values) { 
     if (!value) 
      return false; 
    } 
    return true; 
} 
+0

Come posso utilizzare questo metodo per stampare un'istruzione "Hai raggiunto la fine" una volta controllato l'intero array? Non capisco questo ciclo. – Daybreak

+0

È possibile utilizzare questo metodo per controllare l'array: System.out.println ("Raggiunto il fine, tutto vero:" + allTrue (foundLetterArray)); –

+0

Posso usare un'istruzione if con questo? Qualcosa come se (allTrue (foundLetterArray) == true) {System.out.print ("End reahed"); – Daybreak

1

booleano [] foundLetterArray = new boolean [5]; L'allocazione di memoria per la matrice abow è come

 foundLetterArray[0],foundLetterArray[1],foundLetterArray[2],foundLetterArray[3],foundLetterArray[4] 

indice Array inizia con 0 e il conteggio memoria totale è 5 e l'ultimo indice dell'array è 4.

Si sta tentando di ottenere l'indice 5 ovvero foundLetterArray [5] che non esiste. È per questo che hai trovato l'Array ArrayIndexOutofBoundsException

if(foundLetterArray[selectedWord.length()-1]==true){ 
     System.out.println("You have reached the end"); 
    } 
0

in Java parte da index 0 e ultimo indice è sempre [array.length()-1]

Come si sta verificando per foundLetterArray[selectedWord.length()], la sua dando una serie di eccezioni Bound provare foundLetterArray[selectedWord.length()-1]

come:

if(foundLetterArray[selectedWord.length()-1]){ 
System.out.println("You have reached the end"); 
} 
0

Indici in Java, così come mos t linguaggi di programmazione, sono basati su 0, nel senso che i singoli elementi di una matrice con n elementi hanno indici 0, 1, 2, ..., n-1. L'ultimo elemento di un array è sempre in index array.length - 1.

0

L'indice di matrice inizia da 0 quindi l'ultimo indice è sempre 1 in meno della lunghezza dell'array, quindi qui si sta tentando di accedere all'ultimo indice + 1 eseguendo foundLetterArray [ selectedWord.length()] questo in modo che sia possibile utilizzare ArrayIndexBoundEception usando il metodo array.lastIndex() o sottrarre 1 lunghezza del modulo.

L'implementazione di questa foundLetterArray[selectedWord.length()-1] si deve prendere cura di una cosa se la matrice non lo fa contenente elementi poi selectedWord.length() return 0 e di nuovo si ottengono stessa eccezione per cui il suo bene verificare lengh prima di fare questo foundLetterArray[selectedWord.length()-1].

0

fare questo

public boolean allTrue(boolean[] array) { 
    for (boolean b : array) { 
     if (!b) { 
      return false; 
     } 
    } 
    return true; 
} 

Non c'è modo 'una linea' di sapere se tutti gli elementi di un array incontrano una certa condizione (ci sono le librerie che si prendono cura del loop per voi, ma voi ancora bisogno di scrivere la condizione). L'array di query [x] ti dirà solo della xth di quell'array, quindi per la tua domanda dovrai controllare ogni elemento.

Inoltre, come altri hanno sottolineato, gli indici di matrice sono a base di 0, quindi il primo elemento è nell'array [0] e l'ultimo nell'array [array.length() - 1].

Nell'esempio seguente viene utilizzato un costrutto di loop alternativo noto come for-each. Questo è appropriato quando non è necessario modificare i contenuti dell'array, è sufficiente leggerli da essi. Evita qualsiasi problema con gli indici.

0

Si esegue il controllo solo per l'ultimo elemento nell'array (e lo si fa male, sopra viene descritto il motivo).

Per ottenere se gli array contengono solo valori veri, è necessario verificarli tutti.

boolean allAreTrue = true; 
for (boolean val : foundLetterArray) { 
    allAreTrue = allAreTrue && val; 
} 

// in questa linea allAreTrue conterrà vero se tutti i valori sono true e false se si dispone di almeno un "falso"

+2

Questo è inefficiente poiché non si fermerà se viene rilevato un valore falso. – Dariusz

+0

Questo è leggibile per un principiante. – Danila

+0

No non lo è, non è affatto leggibile per un principiante. E insegnare un codice scadente non è vantaggioso per nessuno. –

2

C'è un Java 8-liner per questo:

boolean allTrue(boolean[] arr) { 
    return IntStream.range(0, arr.length).allMatch(i -> arr[i]); 
}