2013-09-05 9 views
5

Mam tablicę typu boolean, której rozmiar zależy od wielkości losowo wybranego ciągu.Jak sprawdzić WSZYSTKIE elementy tablicy boolowskiej są prawdziwe

Więc mam coś takiego:

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

Ponieważ program postępuje, ten konkretny logiczna tablica zostanie wypełniony prawdziwych wartości dla każdego elementu w tablicy. Chcę wydrukować oświadczenie, gdy tylko wszystkie elementy tablicy będą prawdziwe. Tak próbowałem:

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

Daje mi to błąd wyjątku poza granicami. Próbowałem również metody , ale to kończy się pętli, nawet jeśli 1 element w tablicy jest true. Czy potrzebuję pętli for, która iteruje przez wszystkie elementy tablicy? Jak mogę ustawić w tym warunek testowy?

+1

Indeksy tablic zaczynają się od 0, więc ostatnim elementem jest "foundLetterArray [selectedWord.length() - 1]". Również '== true' jest nieco zbędne; nie musisz porównywać wartości prawdziwości z inną, ale możesz użyć jej bezpośrednio jako warunku. – kiheru

+0

Potrzebujesz pętli, aby sprawdzić, czy wszystkie elementy są "prawdziwe". W pętli możesz zatrzymać się, gdy napotkasz pierwszy element 'false'. – cyon

+0

Pozdrawiam facetów. Rozwiązuje to problem związany, ale instrukcja if przyjmuje, że cała tablica ma wartość true, jeśli tylko ostatni element jest prawdziwy. Jakieś pomysły na obejście tego? Na przykład, jeśli wszystkie elementy są fałszywe, a ostatni element jest prawdziwy, oznacza to, że "osiągnąłeś koniec". Czy to prawda? czy znowu zrobiłem coś złego? – Daybreak

Odpowiedz

10

Używanie wzmocnione dla pętli, można łatwo iteracyjne nad tablicy, nie ma potrzeby dla indeksów i obliczenia wielkości:

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

Jak korzystać z tej metody, aby wydrukować wyrażenie "Osiągnąłeś koniec" po sprawdzeniu całej tablicy? Nie rozumiem tej pętli. – Daybreak

+0

Możesz użyć tej metody do sprawdzenia swojej tablicy: System.out.println ("Osiągnięto koniec, wszystko prawda:" + allTrue (foundLetterArray)); –

+0

Czy mogę użyć instrukcji if z tym? Coś jak w przypadku (allTrue (foundLetterArray) == true) {System.out.print ("End reahed"); – Daybreak

1

boolean [] foundLetterArray = new boolean [5]; Alokacja pamięci dla abow tablicy jest jak

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

Indeks tablicy zaczyna się od 0, a łączna liczba pamięci 5 i ostatni indeks tablicy jest 4.

Próbujesz uzyskać indeks 5, który jest foundLetterArray [5], który nie istnieje. Dlatego otrzymujesz ArrayIndexOutofBoundsException

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

tablic w Java zaczyna się od index 0 i ostatni wskaźnik jest zawsze [array.length()-1]

Jak jesteś sprawdzanie foundLetterArray[selectedWord.length()], jej daje tablicę się od związanego Exception spróbować foundLetterArray[selectedWord.length()-1]

odczuwalna:

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

Indeksy w Javie, a także mos t języki programowania są oparte na 0, co oznacza, że ​​poszczególne elementy w tablicy z n elementami mają indeksy 0, 1, 2, ..., n-1. Ostatni element w tablicy jest zawsze w tablicy index.length - 1.

0

Indeks tablicy zaczyna się od 0, więc ostatni indeks jest zawsze o 1 mniejszy niż długość tablicy, więc tutaj próbujesz uzyskać dostęp do ostatniego indeksu + 1 wykonując foundLetterArray [ selectedWord.length()] to jest tak, że ArrayIndexBoundEception używa metody array.lastIndex() lub odejmuje 1 długość formularza.

Realizacja tego foundLetterArray[selectedWord.length()-1] Musisz zadbać o jednej rzeczy, jeśli tablica nie zawiera żadnych elementów, następnie selectedWord.length() return 0 i znowu dostaniesz taki sam wyjątek więc dobrze jest sprawdzić lengh przed wykonaniem tej foundLetterArray[selectedWord.length()-1].

0

zrobić

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

Nie ma „jednej linii” sposobem wiedząc, czy wszystkie elementy tablicy spełniać pewien warunek (istnieją biblioteki, które zajmie się zapętlenie dla ciebie, ale ty nadal trzeba napisać warunek). Zapytanie tablicy [x] powie ci tylko o pozycji x w tej tablicy, więc na pytanie musisz sprawdzić każdy przedmiot.

Ponadto, jak wskazywały inne osoby, indeksy tablicowe są oparte na 0, więc pierwszy element znajduje się w tablicy [0], a ostatnia w tablicy [array.length() - 1].

Mój przykład używa alternatywnej konstrukcji pętli zwanej "for-each". Jest to odpowiednie, gdy nie musisz modyfikować zawartości tablicy, musisz tylko z nich czytać. Pozwala uniknąć problemów z indeksami.

0

Sprawdzasz tylko ostatni element w tablicy (i robisz to źle, powyżej opisano dlaczego).

Aby uzyskać, jeśli tablice zawierają tylko wartości rzeczywiste, należy sprawdzić je wszystkie.

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

// na tej linii allAreTrue będzie zawierać prawdziwe, jeśli wszystkie wartości są prawdziwe i fałszywe, jeśli masz co najmniej jeden „false”

+2

Jest to nieefektywne, ponieważ nie zatrzyma się, jeśli napotkana zostanie wartość false. – Dariusz

+0

To jest przeznaczone dla początkujących. – Danila

+0

Nie, nie, nie jest to czytelne dla początkujących. A nauczanie słabego kodu nie jest korzystne dla nikogo. –

2

jest Java 8 jedna wkładka do tego:

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