2016-09-27 50 views
0

我正在嘗試接受用戶輸入並進行修改,以便打印沒有任何元音的字符串。我已經能夠用下面的代碼成功地完成了。打印UI不使用元音使用循環不使用replaceAll();在Java中

Scanner in = new Scanner(System.in); 
    System.out.println("Enter a word: "); 
    String word = in.next(); 

    String newString = word.replaceAll("[aeiouAEIOU]","1"); 
    System.out.printf("%s", newString); 

但是,我試圖通過使用沒有上述方法replaceAll()的循環來獲得相同的效果。我已經嘗試了另外一次,但在邏輯中混淆並重新啓動。我最近的嘗試是在下面,我不明白爲什麼它不能正常運行。我會輸入一個字符串,並且沒有任何錯誤信息,它將不會打印回任何東西。我得到它的工作的唯一的一次是當我給它的單個字符的字符串中找到使用類似

if(letter.contains("a")) 

如果發現情況屬​​實,將打印回的串,但是,這並不適用於任何字符組合,只有單個字符。我的完整代碼如下。

import java.util.Scanner; 

public class practice 
{ 
    public static void main(String[] args) 
    { 
    Scanner in = new Scanner(System.in); 
    System.out.println("Enter a word: "); 
    String word = in.next(); 
    int i = 0; 

    while (i < word.length()){ 
     String letter = word.substring(i, (i+1)); 
     if(letter.contains("[bcdfghjklmnpqrstvwxyz]")){ 
      System.out.printf("%s",letter); 
     } 
     i++; 
    } 
    } 
} 

我只是想找到一種方法來完成這個程序只使用條件,循環,UI,只有方法長度(),包含()或的indexOf()的charAt(),和子( X,Y)。預先感謝任何幫助,我希望我已經提供了足夠的信息。

下面是一些示例輸出:

Enter a word: 
Jordan 

我輸入的詞後,程序停止。

+0

字符串' 「B」'(例如)不能包含字符串' 「bcdfghjklmnpqrstvwxyz」' 。太短了。 – ajb

+0

對不起,我編輯並在我正在尋找的字母周圍添加[]。不幸的是仍然是同樣的錯誤,沒有得到任何輸出。我在問題中提供了一個示例輸出,希望能稍微澄清一點,謝謝。 –

+0

'contains'不使用正則表達式,並且使用'[]'創建正則表達式。不過,你可以使用'contains()'來解決問題,並且我認爲你是在正確的軌道上,但是犯了一個小錯誤。您可以對原來的代碼進行簡單的更改(沒有'[]')。想一想。 – ajb

回答

1

一種方法是將字符串轉換爲字符toCharArray(),然後用情況相比,數組,並添加一個新的鏈的StringBuilder

String word = in.next(); 
    StringBuilder bul = new StringBuilder(); 
    for (char arg : word.toLowerCase().toCharArray()) { 
     switch(arg) 
     { 
      case 'a': System.out.println("A");break; 
      case 'e': System.out.println("E");break; 
      case 'i': System.out.println("I");break; 
      case 'o': System.out.println("O");break; 
      case 'u': System.out.println("U");break; 
      default: 
       bul.append(arg); 
     } 
    } 
    System.out.println(bul); //String not Vowels 

在你的代碼可能會改變,爲什麼用subtring所選字符絕不能包含這樣的一長串這樣"[bcdfghjklmnpqrstvwxyz]"

if(letter.contains("[bcdfghjklmnpqrstvwxyz]")){...} 

if("[bcdfghjklmnpqrstvwxyz]".contains(letter.toLowerCase())){...} 
+0

更改if語句,並感謝您使用其他方法。你能解釋一下爲什麼後一種創建contains()方法的方法起作用,而不是我創建的方法?我只是想學習一切的細節,以便儘可能地理解。謝謝。 –

+0

因爲我的確使用'substring()'作爲字符串的一個字符,然後想知道該字符是否包含整個字符串'「[bcdfghjklmnpqrstvwxyz]」'邏輯'n'不能包含'n + n'個字符那總是'返回false',否則它會詢問'n'是否包含'n-1',這是最合理的並且更可能返回'true' – DarkFenix

0

您可以使用Scanner.useDelimeter(Pattern pattern)regex。該regex去除元音 - [^ aeiou]同時+

如果你想忽略大小寫然後用這個模式 - (我)[^ aeiou]同時+

最後試試下面的代碼片段 -

scanner.useDelimeter(Pattern.compile("[^aeiou]+")); 
0

當你說,

if(letter.contains("bcdfghjklmnpqrstvwxyz")) 

你的代碼將檢查是否letter有字母的精確序列bcdfghjklmnpqrstvwxyz

換句話說,它不會檢查這些字母是否存在於String中。

相反,你可以是這樣的:

for (int i = 0; i < word.length(); i++) { 
     String currentLetter = String.valueOf(word.charAt(i)); 
     if (!currentLetter.matches("a|e|i|o|u")) 
      System.out.print(currentLetter); 
    } 
0

做的另一種方式是

Scanner s = new Scanner(System.in); 
System.out.print("Enter input String"); 
String input = s.next(); 
StringBuilder sb = new StringBuilder(""); 

for(char c : input.toLowerCase().toCharArray()) 
    if(c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u'){} 
    else sb.append(c+"");' 

System.out.println("Given input without vowels : "+sb);