2016-11-27 42 views
1

我必須將一個句子作爲輸入,逐個提取每個單詞並打印它們各自的輔音數。這是我使用的代碼:從給定句子中提取所有單詞,並將它們與輔音數一起打印

for(int i=0;i<l;i++) 
    { 
     count=0; word=""; 
     if(sentence.charAt(i)!=' ') 
     { 
      word+=sentence.charAt(i); 
     } 
     else 
     { 
      for(int j=0;j<word.length();j++) 
      { 
       ch=word.charAt(i); 
       if (ch!='A'&&ch!='E'&&ch!='I'&&ch!='E'&&ch!='O'&&ch!='U') 
       { 
        count++; 
       } 
      }} 
      System.out.print(word+"\t"+count);} 

我一直在試圖調試此,我總是得到各種輸出我不需要。 我現在面臨的兩個主要問題是:

  1. 如何提取句子中的單詞,並且不能使用掃描儀或其他類和只使用基本的循環
  2. 如何列出正確格式化到一個表準確輔音計數表格

此外,我打算將提取的單詞添加到一個字符串數組在索引等於它的輔音計數。

StringArr[count]=" "+word; 

如果兩個以上的單詞具有相同的輔音數,我將在那裏添加空格。

任何幫助表示讚賞。

P.S.-我是一個新手,所以請隨時指出我可能已經注意到的任何上下文錯誤。

+3

這是一個Java或JavaScript的問題?對於JavaScript,你不需要循環來分開一個句子。只需使用'var words = sentence.split(「」);'。這會給你一個單詞的數組。從那裏開始,你可以循環訪問該數組,每個單詞和每個單詞,然後可以測試輔音。 –

+0

任何替代'var'在JavaScript? – PrometheusWithoutMind

+0

對於常量,有'let'用於塊範圍和'const'。 –

回答

0

可以使用String.split()方法得到的話,然後用printf格式化字符串:

for (String word: sentence.split(" ")) { 
     System.out.printf("%10s: %d\n", word, getConsonantCount(word)); 
    } 

(有關格式的更多信息,爲的printf結賬this cheatsheet) 現在的核心方法程序getConsonantCount()可以實現爲:

public static int getConsonantCount(String word) { 

    word = word.toLowerCase(); 
    int consonantCnt = 0; 

    for (int i = 0; i < word.length(); i++) { 
     char ch = word.charAt(i); 
     if (Character.isLetter(ch)) { 
      if (vowels.indexOf(ch) == -1) { 
       consonantCnt++; 
      } 
     } 
    } 
    return consonantCnt; 
} 

基本上,我們首先驗證字符是字母,然後檢查它是否是一個元音或不試圖獲得其索引的字符串中vowels。如果它不是元音(因此是輔音),則增加計數器。

public static String vowels = "aeiou"; 

手動方式(不String.split())

你正在試圖做到這一點的方法是一種有效的方法。但問題是,你正在爲每個新角色重新設置countword

所以,考慮這個問題:我們應該在哪裏重置這些變量?

當我們找到一個詞並處理它。它需要在其他塊中完成。另外,打印出單詞並在那裏計數。 (現在,您正在處理每個字符後進行打印)。

 for (int i = 0; i < sentence.length(); i++) { 
     if(Character.isLetter(sentence.charAt(i))) { 
      word += sentence.charAt(i); 
     } 
     else if(sentence.charAt(i) == ' ') { 
      for(int j=0;j<word.length();j++) { 
       ch = Character.toUpperCase(word.charAt(j)); 
       if (ch !='A' && ch != 'E' && ch != 'I' && ch!= 'E' && ch != 'O' && ch != 'U') { 
        count++; 
       } 
      } 
      System.out.printf("%10s: %d\n", word, count); 
      count = 0; 
      word =""; 
     } 
    } 

這並不代表硬道理。一種解決方案可能是預先在句子末尾添加空間

當您遇到空間時,您也可以只是對輔音進行計數,而不是構建單詞並對其進行處理。

count = 0; 
    int start = 0; 

    for (int i = 0; i < sentence.length(); i++) { 
     if (Character.isLetter(sentence.charAt(i))) { 
      ch = Character.toUpperCase(sentence.charAt(i)); 
      if (ch != 'A' && ch != 'E' && ch != 'I' && ch != 'E' && ch != 'O' && ch != 'U') { 
       count++; 
      } 
     } else if (sentence.charAt(i) == ' ') { 
      System.out.printf("%10s: %d\n", sentence.substring(start, i), count); 
      start = i + 1; 
      count = 0; 
     } 
    } 

這裏,變量start跟蹤當前單詞的開始。

至於stringArray變量,請考慮將其設置爲Map

2

如果您使用最簡單的代碼來處理問題,那麼您的代碼就會減少,這通常會更容易理解,從而減少錯誤。

被簡單地與非輔音的長度除去輔音的數目:

int count = str.replaceAll("(?i)[^b-df-hj-np-tv-z]", "").length(); 

正則表達式的解釋:

  • (?i)意味着忽略大小寫
  • [^...]否定的字符類,即任何字符不在列表中
  • b-d意味着在範圍字符bd(含)
  • 等其它字符範圍

此代碼迎合邊緣情況也一樣,而你的代碼有缺陷;它將所有「非元音」作爲輔音來計數,但這也會計算撇號。考慮"can't"有3個輔音。

使用上面,再加上split()讓 「字」:

for (String word : sentence.split("\\s+")) { 
    int count = str.replaceAll("(?i)[^b-df-hj-np-tv-z]", "").length(); 
    System.out.println(word + '\t' + count); 
} 

採用流和在線的數,你可以做到這一點在1個語句:

Arrays.stream(sentence.split("\\s+")) 
    .forEach(w -> System.out.println(w + '\t' + 
    w.replaceAll("(?i)[^b-df-hj-np-tv-z]", "").length()); 

免責聲明:代碼可能無法編譯或工作,因爲它是我的手機(雖然有合理的機會,它會工作)

相關問題