2017-02-20 21 views
0

我有一個代碼來檢查字符串中是否有三個連續的輔音。它看起來像這樣:檢查任何3個連續的輔音

String cons = "bcdfghjklmnpqrstvwxyz"; 
    char[] consonants = cons.toCharArray(); 

     int z = 0; 
     Scanner scan = new Scanner(System.in); 
     System.out.println("Enter your word!"); 
     String word = scan.next().toLowerCase(); 
     int length = word.length(); 
     char[] ch = word.toCharArray(); 
     for (int i = 0; i < length-2; i++) { 
      for (int j = 0; j < 21; j++) { 
       if ((ch[i] == consonants[j]) && 
         (ch[i + 1] == consonants[j]) 
         && (ch[i + 2] == consonants[j])) { 
        z++; 
        break; 
       } 
      } 
      if (z == 1) 
       break; 
     } 
     if (z == 1) { 
      System.out.println("Three consecutive consonants here!"); 
     } else { 
      System.out.println("It is fine!"); 
     } 

但我想檢查任何三個連續的輔音。找到像聖誕節,國家,孩子,學校等字樣

而不知道如何更改此代碼來做到這一點。你能幫我嗎?

+0

你是什麼意思,檢查你的字符串中存在三次「bcd」,或者是什麼? –

+0

只有一次 - 連續三個輔音 –

+0

我真的不能理解你的問題,你能否提供一些例子讓我能理解? –

回答

1

在我看來,最好的辦法是循環瀏覽你想要搜索的字。每當您目前所在的字母都在輔音陣列中時,請將其添加到z。每當您目前所在的字母不在輔音陣列中時,請將z設置爲零。如果在任何時候,z等於三,比你知道你搜索的字符串連續有3個輔音,你可以跳出循環。如果你得到循環結束,並且z從來沒有達到三,你知道你正在搜索的字符串沒有三個連續的輔音。我希望這有助於編程,祝你好運!

1

你應該看看String文檔,尤其是contains()方法。

1

我認爲如果你自己聲明一個像private static boolean isConsonant(char ch)這樣的輔助方法,會更容易管理。此方法將包含一個遍歷consonants數組的循環,並返回true是參數與輔音之一相同。

現在在您的主程序中,您可以循環輸入單詞的字符,同時保留連續的輔音數。我將以country爲例。你拿c,你的方法應該告訴你它是一個輔音,所以增加計數到1. o不是,所以重置爲零。爲u做同樣的事情(不改變任何東西,但最簡單的做法是)。現在來到n,tr,所以你的計數會上升到1,然後是2,然後是3.當它達到3時,你完成了,因爲你知道你有3個連續的輔音。

裏面你的循環,你會打電話給你的方法在if - else聲明一樣if (isConsonant(ch)) ...你會有另外if語句來看看如果計數爲3 - 內部或後的第一個。

1

你問如何您可以更改代碼,使其工作,所以下面是基於您的代碼,將工作:

String cons = "bcdfghjklmnpqrstvwxyz"; 
char[] consonants = cons.toCharArray(); 

int z = 0; 
Scanner scan = new Scanner(System.in); 
System.out.println("Enter your word!"); 
String word = scan.next().toLowerCase(); 
int length = word.length(); 
char[] ch = word.toCharArray(); 
for (int i = 0; i < length; i++) { 
    boolean isConsonant = false; 
    for (int j = 0; j < 21; j++) { 
     if (ch[i] == consonants[j]) { 
      isConsonant = true; 
      break; 
     } 
    } 
    if (isConsonant) { 
     z++; 
     if (z == 3) 
      break; 
    } else { 
     z = 0; 
    } 
} 
if (z == 3) { 
    System.out.println("Three consecutive consonants here!"); 
} else { 
    System.out.println("It is fine!"); 
} 

現在的代碼由字符檢查字符,如果它是一個輔音。如果是輔音計數器z增加。只要計數器達到3,for循環就會退出,並且每當發現一個不是輔音的字符時,計數器就會重置爲零。

但這種檢查可以使用正則表達式可以非常容易地實現:

Scanner scan = new Scanner(System.in); 
System.out.println("Enter your word!"); 
String word = scan.next().toLowerCase(); 
if (Pattern.compile("[a-z&&[^aeiuo]]{3}").matcher(word).find()) { 
    System.out.println("Three consecutive consonants here!"); 
} else { 
    System.out.println("It is fine!"); 
} 

[a-z]是從A到Z的任何字符,[^aeiuo]是除了元音字母的任何字符。兩者的交集使用&&完成,並且得到的[a-z&&[^aeiuo]]代表輔音。因爲我們正在尋找連續三個輔音{3}因此被添加。

在這裏,您可以在正則表達式查找詳細信息:http://www.regular-expressions.info

+0

非常感謝!這個正則表達式版本適用於俄羅斯版本嗎?如果我把它寫成像... Pattern.compile(「[а-я&& [^aeёиоуыя]] {3}」).matcher(word).find()) –

1

沒有必要使用嵌套的for循環。你可以通過使用indexOf()API來檢查這個值是否存在於你的輔音字符串中。

String cons = "bcdfghjklmnpqrstvwxyz"; 


     int z = 0; 
     Scanner scan = new Scanner(System.in); 
     System.out.println("Enter your word!"); 
     String word = scan.next().toLowerCase(); 
     //int length = word.length(); 
     char[] ch = word.toCharArray(); 
     for (int i = 0; i < ch.length-2; i++) { 

       if (
         cons.indexOf(ch[i])!=-1 && 
         cons.indexOf(ch[i+1])!=-1 && 
         cons.indexOf(ch[i+2])!=-1 
        ) 
       { 
        z++; 
        break; 
       } 
       if (z == 1) 
       break; 
     } 
     if (z == 1) { 
      System.out.println("Three consecutive consonants here!"); 
     } else { 
      System.out.println("It is fine!"); 
     } 
     } 
+0

非常感謝您講述這種方法。 –