提取给定句子中的所有单词并将其与辅音计数一起打印

时间:2016-11-27 04:47:58

标签: java arrays string

我必须将一个句子作为输入,逐一从中提取每个单词并用它们打印各自的辅音计数。这是我正在使用的代码:

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. 如何列出正确格式化为表格形式的准确辅音计数
  3. 此外,我打算将提取的单词添加到String数组中,其索引等于其辅音计数。

    StringArr[count]=" "+word;
    

    如果两个以上的单词具有相同的辅音计数,我会在那里添加空格。

    感谢任何帮助。

    P.S.-我是这方面的新手,所以请随时指出我可能注意到的任何背景错误。

2 个答案:

答案 0 :(得分:2)

如果您使用最简单的代码解决问题,那么您将拥有更少的代码,这通常会更容易理解,从而减少错误。

辅音的数量只是取消非辅音的长度:

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

正则表达式解释:

  • (?i)表示忽略大小写
  • [^...]否定的字符类,即列表中没有的任何字符
  • b-d表示范围为bd(含)的字符
  • 等其他角色范围

此代码也适用于边缘情况,而您的代码有错误;它会计算所有非元音和#34;作为一个辅音,但那也算撇号。考虑"can't"有3个辅音。

使用上述内容,加上split()来获取&#34;字&#34;:

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());

免责声明:代码可能无法编译或工作,因为它在我的手机上被翻阅(但它有合理的可能性)

答案 1 :(得分: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

所以,考虑一下这个问题:我们应该在哪里重置这些变量?

当我们找到一个单词并进行处理时。它需要在 else 块中完成。此外,打印出来并在那里计算。 (现在,您在处理每个角色后进行打印)。

      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