2013-09-05 82 views
5

Tôi có một mảng boolean có kích thước phụ thuộc vào kích thước của một chuỗi được chọn ngẫu nhiên.Cách kiểm tra TẤT CẢ các phần tử của một mảng boolean là đúng

Vì vậy, tôi có một cái gì đó như thế này:

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

Khi chương trình đang diễn ra, mảng boolean đặc biệt này được lấp đầy với các giá trị đích thực cho mỗi phần tử trong mảng. Tôi chỉ muốn in một tuyên bố ngay sau khi tất cả các phần tử của mảng là đúng. Vì vậy, tôi đã thử:

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

Điều này mang lại cho tôi một lỗi ngoài ngoại lệ. Tôi cũng đã thử phương pháp nhưng kết thúc vòng lặp ngay cả khi 1 phần tử trong mảng là đúng. Tôi có cần một vòng lặp for lặp đi lặp lại qua tất cả các phần tử của mảng không? Làm thế nào tôi có thể thiết lập một điều kiện thử nghiệm trong đó?

+1

Chỉ số mảng bắt đầu bằng 0, do đó phần tử cuối cùng là 'foundLetterArray [selectedWord.length() - 1]'. Ngoài ra '== true' là một chút dư thừa; bạn không cần phải so sánh giá trị chân lý với giá trị khác, nhưng có thể sử dụng nó trực tiếp làm điều kiện. – kiheru

+0

Bạn cần một vòng lặp để kiểm tra xem tất cả các phần tử là 'true'. Trong vòng lặp, bạn có thể dừng lại khi bạn gặp phải phần tử 'false' đầu tiên. – cyon

+0

Chúc mừng các bạn. Điều này giải quyết vấn đề bị ràng buộc, nhưng câu lệnh if này giả định toàn bộ mảng là đúng nếu chỉ phần tử cuối cùng là đúng. Bất kỳ ý tưởng về cách để có được xung quanh đó? Ví dụ: nếu tất cả các phần tử là sai và phần tử cuối cùng là đúng, nó nói "Bạn đã đạt đến kết thúc". Điều đó có đúng không? hoặc tôi đã làm điều gì đó sai một lần nữa? – Daybreak

Trả lời

10

Sử dụng tăng cường cho vòng lặp, bạn có thể dễ dàng duyệt qua một mảng, không cần chỉ số và tính toán kích thước:

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

Làm cách nào để sử dụng phương pháp này để in câu lệnh "Bạn đã đạt đến kết thúc" khi toàn bộ mảng được chọn? Tôi không hiểu vòng lặp này. – Daybreak

+0

Bạn có thể sử dụng phương pháp này để kiểm tra mảng của bạn: System.out.println ("Đã đến cuối, tất cả đều đúng:" + allTrue (foundLetterArray)); –

+0

Tôi có thể sử dụng câu lệnh if với điều này không? Một cái gì đó như if (allTrue (foundLetterArray) == true) {System.out.print ("End reahed"); – Daybreak

1

boolean [] foundLetterArray = new boolean [5]; Việc phân bổ bộ nhớ cho mảng abow là như

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

chỉ số mảng bắt đầu với 0 và tổng số bộ nhớ là 5 và chỉ số mảng cuối cùng là 4.

Bạn đang cố gắng để có được chỉ số 5 đó là foundLetterArray [5] không tồn tại. Đó là lý do tại sao bạn đang nhận được Mảng ArrayIndexOutofBoundsException

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

trong Java bắt đầu từ index 0 và chỉ số cuối cùng luôn là [array.length()-1]

Như bạn đang kiểm tra cho foundLetterArray[selectedWord.length()], nó tạo cho bạn một mảng ra khỏi ngoại lệ ràng buộc thử foundLetterArray[selectedWord.length()-1]

Giống như:

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

Chỉ mục trong java, cũng như mos Các ngôn ngữ lập trình, là 0-based, có nghĩa là các phần tử riêng lẻ trong một mảng với các phần tử n có các chỉ số 0, 1, 2, ..., n-1. Phần tử cuối cùng trong mảng luôn luôn ở mảng index.length - 1.

0

Chỉ số mảng bắt đầu từ 0 để chỉ số cuối luôn nhỏ hơn 1 thì chiều dài mảng sao cho ở đây bạn đang cố gắng truy cập chỉ mục cuối cùng + 1 bằng cách làm foundLetterArray [ selectedWord.length()] này vì vậy nó đang throuing ArrayIndexBoundEception sử dụng array.lastIndex() phương pháp hoặc trừ 1 chiều dài hình thức.

Thực hiện điều này foundLetterArray[selectedWord.length()-1] Bạn phải chăm sóc về một điều nếu mảng của bạn không chứa bất kỳ yếu tố sau đó selectedWord.length() return 0 và một lần nữa bạn sẽ nhận được cùng một ngoại lệ rất tốt của nó để kiểm tra trước khi làm lengh foundLetterArray[selectedWord.length()-1] này.

0

làm điều này

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

Không có 'một dòng' cách nào để biết liệu tất cả các yếu tố của một mảng đáp ứng một điều kiện nhất định (có thư viện mà chăm sóc của vòng lặp cho bạn, nhưng bạn vẫn cần viết điều kiện). Truy vấn mảng [x] sẽ chỉ cho bạn biết về mục thứ x trong mảng đó, vì vậy đối với câu hỏi của bạn, bạn cần kiểm tra mọi mục.

Ngoài ra, như những người khác đã chỉ ra, các chỉ mục mảng là 0-based, do đó phần tử đầu tiên là mảng [0] và phần tử cuối cùng tại mảng [array.length() - 1].

Ví dụ của tôi sử dụng cấu trúc vòng lặp thay thế được gọi là cho mỗi. Điều này là thích hợp khi bạn không cần sửa đổi nội dung mảng, bạn chỉ cần đọc từ chúng. Nó tránh bất kỳ rối tung xung quanh với các chỉ số.

0

Bạn chỉ kiểm tra phần tử cuối cùng trong mảng (và làm sai, ở trên được mô tả lý do tại sao).

Để nhận được nếu mảng chỉ chứa giá trị thực, bạn nên kiểm tra tất cả các giá trị đó.

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

// ở dòng này allAreTrue sẽ chứa đúng nếu tất cả các giá trị là true và false nếu bạn có ít nhất một "false"

+2

Điều này không hiệu quả vì nó sẽ không dừng nếu gặp phải một giá trị sai. – Dariusz

+0

Điều này có thể đọc được cho người mới bắt đầu. – Danila

+0

Không, nó không phải là không thể đọc được ở tất cả cho một người mới bắt đầu. Và dạy mã nghèo không có lợi cho bất cứ ai. –

2

có một Java 8 one-liner cho việc này:

boolean allTrue(boolean[] arr) { 
    return IntStream.range(0, arr.length).allMatch(i -> arr[i]); 
} 
Các vấn đề liên quan