2010-10-13 38 views
5

nếu (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') { đếm ++;kiểm tra ký tự

Khi tôi đưa ra tuyên bố ở trên, nó trả về số nguyên âm trong một từ chỉ khi từ đã cho bằng chữ thường (ví dụ: input: friend output 2 nguyên âm). Tôi muốn biết ngay cả khi tôi viết hoa hoặc trộn nó sẽ trả lại số nguyên âm. Làm thế nào để làm nó?

+0

+1 cho câu hỏi của bạn đã truyền cảm hứng cho rất nhiều câu trả lời khác nhau. – DerMike

+0

ya cảm ơn u mike – Sumithra

Trả lời

1

Bạn có thể sử dụng các bài kiểm tra như:

Character.toLowerCase(c) == 'a' 

thay thế.

+0

ya Tôi đã nhận nó Cảm ơn !! – Sumithra

+3

@Sumithra: lưu ý rằng điều này sẽ thất bại trong một miền địa phương Thổ Nhĩ Kỳ, bởi vì nó có chấm và dotless i ở cả chữ hoa và chữ thường, nên Character.toLowerCase ('I') == 'ı' và Character.toUpperCase ('i') == 'İ' http://en.wikipedia.org/wiki/Dotted_and_dotless_I –

+0

Làm thế nào là một thất bại? –

3

Nếu bạn muốn nhận được trên hoặc chữ thường một cách tiếp cận đơn giản có vẻ là như sau:

lặp qua tất cả các ký tự trong văn bản và làm các xét nghiệm sau:

if (c=='a' || c=='e' || c=='i' || c=='o' || c=='u' 
|| c=='A' || c=='E' || c=='I' || c=='O' || c=='U') 
    { count++ }; 
+5

+1 để sử dụng "nguyên tắc thay đổi khái niệm tối thiểu".Điều này thường bị bỏ qua trong thời gian vội vàng để tái cấu trúc nhưng có những tình huống (chẳng hạn như sửa chữa các vấn đề sản xuất cho một), nơi nó quan trọng, để đảm bảo bạn không giới thiệu các vấn đề khác. Không có gì quá cau mày khi giới thiệu một lỗi mới trong một bản sửa lỗi sản xuất :-) – paxdiablo

+0

+1 nhận xét về "nguyên tắc thay đổi khái niệm tối thiểu" .. không bao giờ biết đây là một khái niệm mặc dù chúng ta thường sử dụng nó. – Jayan

6

Here có một ví dụ hoàn chỉnh - lưu ý rằng họ biến chuỗi thành chữ thường trước khi kiểm tra nguyên âm.

Bạn cũng có thể thử với một trường hợp không nhạy cảm biểu hiện thường xuyên, ví dụ từ http://www.shiffman.net/teaching/a2z/regex/:

String regex = "[aeiou]";    
Pattern p = Pattern.compile(regex,Pattern.CASE_INSENSITIVE); 
int vowelcount = 0; 
Matcher m = p.matcher(content);   // Create Matcher 
while (m.find()) { 
    //System.out.print(m.group()); 
    vowelcount++; 
} 
+0

Một điểm cộng khác cho cụm từ thông dụng là nó có thể dễ dàng trích xuất thành một phương thức riêng biệt và có thể được sử dụng lại cho các mẫu khác. – Ruben

+1

+1 Giải pháp thanh lịch nhất imho –

+0

Hmmm như mọi người đều biết, regexp là giải pháp * nhanh nhất *. Ý tôi là, phát triển khôn ngoan ... –

1

tôi nói với bạn một điều, nếu bạn cho đặt ra trong trường hợp trên sau đó trong mã của bạn chấp nhận đưa ra đưa vào chữ thường.

nếu chuỗi str = 'FRIEND'

handle str.Tolower(); Hãy thử điều này Tôi nghĩ rằng vấn đề của bạn được giải quyết.

9

Một succint, cách đơn giản để làm điều này mà không làm 10 so sánh:

if ("aeiouAEIOU".indexOf(c) != -1) { count++; } 
1

Không phải là giải pháp hiệu quả nhất, nhưng có lẽ là ngắn nhất? :)

int vowelCount = (inputString+" ").split("(?i)[aoeuiy]").length - 1 

Btw, tôi là người duy nhất đếm 'y' làm một cái xẻng? ;)

1

Làm thế nào về:

if (Arrays.asList('a', 'e', 'i', 'o', 'u').contains(Character.toLowerCase(c))) { 
    ... 
} 

tôi cũng static final danh sách là tốt.

+1

Danh sách đó nên được bao bọc bên trong 'Collections.unmodifiableList (..)' khi được khai báo là cuối cùng tĩnh. – whiskeysierra

1

Đây là một lớp tiện ích khá đơn giản:

public class Main { 
    public static int countChars(String string, Character... characters) { 
     return countChars(string, new HashSet<Character>(Arrays.asList(characters))); 
    } 

    public static int countChars(String string, Set<Character> characters) { 
     int count = 0; 
     for(int i = 0; i < string.length(); i++){ 
      if(characters.contains(string.charAt(i))){ 
       count++; 
      } 
     } 
     return count; 
    } 

    public static int countCharsIgnoreCase(String string, Character... characters) { 
     return countCharsIgnoreCase(string, new HashSet<Character>(Arrays.asList(characters))); 
    } 

    public static int countCharsIgnoreCase(String string, Set<Character> characters) { 
     Set<Character> finalCharacters = new HashSet<Character>(); 
     for (Character character : characters) { 
      finalCharacters.add(Character.toUpperCase(character)); 
      finalCharacters.add(Character.toLowerCase(character)); 
     } 

     return countChars(string, finalCharacters); 
    } 
} 

code on ideone

1

Sử dụng ổi của CharMatcher:

private final CharMatcher vowels = CharMatcher.anyOf("aeiouAEIOU"); 

... 

// somewhere in your method: 
if (vowels.matches(c)) { 
    ... 
} 
1

Không nhìn thấy một Set chưa :-(

static Character charvowels[] = { 'A','I','U','E','O','a','i','u','e','o' }; 
    static Set<Character> vowels = new HashSet<Character>(Arrays.asList(charvowels)); 
    ... 
    public void countVowel(char c) { 
    if (vowels.contains(c)) count++; 
    } 
Các vấn đề liên quan