2013-03-19 41 views
8

Tôi đang cố gắng kiểm tra xem một từ chỉ chứa một tập hợp các chữ cái như I, O, S, H và X Giả sử người dùng nhập: SSHX, đầu ra sẽ được có nhưng nếu người dùng nhập SHEXX, sản lượng sẽ là NOKiểm tra xem chuỗi có chứa chỉ một bộ chữ cái

public static void main(String[] args) { 
    Scanner sc = new Scanner(System.in); 

    String word = sc.next(); 
    word = word.toUpperCase(); 

    int length = word.length(); 
    char letter = 0; 

    for (int counter = 0; counter < length; counter++) { 
     letter = word.charAt(counter); 
    } 
    if (letter != 'I' && letter != 'O' && letter != 'S' && letter != 'H' && letter != 'Z' && letter != 'X' && letter != 'N') { 
     System.out.print("NO"); 
    } else { 
     System.out.print("YES"); 
    } 
} 
+0

Một regex là giải pháp đơn giản nhất, nhưng nếu bạn muốn biết tại sao máy của bạn không hoạt động, đó là vì bạn không thử nghiệm bất cứ thứ gì bên trong vòng lặp 'for'. Bạn có thể thấy điều này cho chính mình trong trình gỡ lỗi. – rob

Trả lời

11

Bạn có cách giải quyết tốt. Vấn đề là bạn không thực sự kiểm tra từng chữ cái, vì vậy bạn cần phải kiểm tra bên trong vòng lặp for hoặc bạn sẽ chỉ kiểm tra chữ cái cuối cùng. Nhưng sau đó bạn không thể in các "YES" như bạn chỉ muốn in nó nếu TẤT CẢ chữ là có, vì vậy bạn có thể sử dụng một giá trị boolean để kiểm tra xem là tốt, như vậy:

boolean isMatch = true; 
    for (int counter = 0; counter < strLength && isMatch; counter++) { 
     letter = word.charAt(counter); 
     if (letter != 'I' && letter != 'O' && letter != 'S' && letter != 'H' && letter != 'Z' && letter != 'X' && letter != 'N') { 
      System.out.print("NO"); 
      isMatch = false; 
     } 
    } 
    if (isMatch) { 
     System.out.print("YES"); 
    } 

Nhưng, như những người khác đã chỉ ra cách sử dụng một biểu thức chính quy có hiệu quả hơn (và điều này có một regex làm việc cho những gì bạn muốn .. các dấu hoa thị có nghĩa là không hoặc nhiều hơn những gì là bên trong dấu ngoặc đơn.):

if (word.matches("[HIOSX]*")) { 
     System.out.print("YES"); 
    } else { 
     System.out.print("NO"); 
    } 
+0

Cảm ơn @Pescis! –

2

sử dụng một biểu thức chính quy:

if (word.matches("[HIOSX]+")) 
    System.out.println("YES"); 
else 
    System.out.println("NO"); 
+2

Regex của bạn sẽ chỉ phù hợp với một chuỗi của một ký tự (mà thực sự phải nằm trong số các ký tự được liệt kê). Bạn cần thêm một '*' để làm cho nó khớp với các từ đa ký tự. –

+0

Cảm ơn. Trên thực tế, nó phải là một '+' để ngăn các chuỗi rỗng khớp với nhau. – EJP

4

sử dụng một regular expression.

String regex = "[OSXHI]*"; 
String string = "SOMETHING"; 
Matcher matcher = Pattern.compile(regex).matcher(string); 
if (matcher.find()) 
{ 
    String match = matcher.group(1); 
    System.out.println(match); 
} 

Một số nguồn bổ sung:

+0

* Sao chép nhận xét đã dán từ câu trả lời khác: * Regex của bạn sẽ chỉ khớp với Chuỗi của một ký tự (mà thực sự phải nằm trong số các ký tự được liệt kê). Bạn cần thêm một '*' để làm cho nó khớp với các từ đa ký tự. –

+0

Nếu bạn chú ý, tôi là người đầu tiên trả lời. Cảm ơn vì lời khuyên. – syb0rg

+0

Tôi đã không nhận thấy, xin lỗi ... phần "sao chép/dán" là cho câu trả lời khác sau đó ... :) –

5

Bên cạnh những câu trả lời rõ ràng của việc sử dụng một biểu thức chính quy, xem xét sử dụng của Google Ổi API để làm này khá simp le:

if(CharMatcher.anyOf("HIOSX").matchesAllOf(word)) { 

} ... 
+1

Tôi nghĩ bạn muốn nó theo cách khác xung quanh: 'CharMatcher.anyOf ("HIOSX"). MatchesAllOf (word) ' –

+0

Lưu ý, không có cà phê hôm nay .. –

0

đầu tiên của tất cả các bạn nên khởi tạo thư như thế này: char letter = '0'; thay vì 0 giây của tất cả vòng lặp của bạn được sử dụng không đúng, hãy thử mã này:

boolean isInSet; 
    for (int counter = 0; counter < strLength; counter++) 
    { 
     letter = word.charAt(counter); 
     if (letter != 'I' && letter != 'O' && letter != 'S' && letter != 'H' && letter != 'Z' && letter != 'X' && letter != 'N') 
     { 
      isInSet=false; 
      counter=strlength; //end loop 
     } 
     else 
     { 
      isInSet=true; 
     } 
    } 
    if(isInSet=true) 
    { 
     System.out.print("YES"); 
    } 
    else 
    { 
     System.out.print("NO"); 
    } 

Bây giờ vòng lặp sẽ lặp qua chuỗi và kiểm tra xem mỗi nhân vật trong bộ này, nếu nó isnt vòng lặp kết thúc và boolean được thiết lập để sai mà kết quả trong NO sản lượng

Các vấn đề liên quan