2016-11-27 41 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()); 

免责声明:代码可能无法编译或工作,因为它是我的手机(虽然有合理的机会,它会工作)

相关问题