【问题标题】:Count all words in a string that start with a capital letter计算字符串中以大写字母开头的所有单词
【发布时间】:2021-03-12 09:16:34
【问题描述】:

我在大学学习 Java,需要编写一个静态 int countCapitals(String s) 方法,该方法返回字符串 s 中有多少单词以大写字母开头。

大写字母是UPPERCASE_LETTER类型或TITLE CASE_LETTER类型的字符(Character)。单词是由一个或多个空格、字符、符号或标点符号分隔的字母或数字序列。

New.countCapitals("你好,亲爱的朋友们!这里——以Ćapital ŁeTtErS开头的单词") == 6

我只能使用 String 和 Character 类中的方法。(没有 RegEx)

public class New {
    static int countCapitals(String s) {
        int c = 0;
        if (Character.isUpperCase(s.charAt(0)) == true
                || Character.isTitleCase(s.charAt(0)) == true) {
            c++;
        }
        for (int i = 0; i < s.length() - 1; i++) {
            if (Character.isLetter(s.charAt(i)) == false
                    && Character.isLetter(s.charAt(i + 1)) == true) {
                if (Character.isUpperCase(s.charAt(i + 1)) == true
                        || Character.isTitleCase(s.charAt(i + 1)) == true) {
                    c++;
                }
            }
        }
        return c;
    }
}

这是我的代码,但它不适用于某些测试。测试已关闭,所以我不知道哪些测试。您能告诉我哪里出了问题以及如何解决吗?

【问题讨论】:

  • 提示:你不需要其他人来解决这些问题。相反:退一步想想你自己的测试。问问自己“正常情况”和“边缘情况”等等。并且:考虑不使用单个字符变量名。如果有的话,使用那些循环索引。但是其他名称应该告诉读者变量是关于什么的。 c, s ... 什么都不告诉读者。
  • 不确定您所说的“测试已关闭”是什么意思,您如何执行代码以查看其是否按预期执行?最简单的方法是创建另一个测试类,根据您在帖子顶部显示的测试用例字符串运行您的代码。剥离所有代码并从您的方法中返回零并运行测试用例 - 这当然是错误的。但是现在你有了一个可重复的测试,实现你的算法并重复,直到你做对了。否则你只是在猜测。
  • @stridecolossus - 我认为 OP 指的是教师运行的测试,因为学生看不到代码运行时将抛出的测试用例,当应用已提交。
  • @DavidMakogon 是的,假设是这样的,因此建议创建一个测试用例。
  • 如果你使用 String#split() 将你的句子分成单词,你需要做的就是检查每个单词的第一个字符。然后您需要做的就是遍历数组并检查word.charAt(0) 是否符合您对大写字母的定义。

标签: java string character


【解决方案1】:

Java 的内置正则表达式包是我要走的路:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class WordsStartingWithCapitalLetter {

    public static void main(String[] args) {
        // Test 1 -- simple sentence
        String s = "The Quick Brown Fox jumps over the lazy Dog";
        System.out.println("\ninput string: " + s);
        System.out.println("capitalized words:" + getCountOfWordsWithInitialCap(s));

        // Test 2 -- punctuation and newlines
        s = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor\n"
        + "incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation\n"
        + "ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit\n"
        + "in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat\n"
        + "non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
        System.out.println("\ninput string: " + s);
        System.out.println("capitalized words:" + getCountOfWordsWithInitialCap(s));

        // Test 3 -- Scottish sirnames and hyphens
        s = "The quick brown MacGavin jumps over the lazy MacGowan-dog";
        System.out.println("\ninput string: " + s);
        System.out.println("capitalized words:" + getCountOfWordsWithInitialCap(s));
    }

    private static final Pattern WORD_WITH_CAP_REGEX = Pattern.compile("([A-Z][-A-Za-z]*)");

    private static int getCountOfWordsWithInitialCap(String s) {
         int count = 0;
         Matcher matcher = WORD_WITH_CAP_REGEX.matcher(s);
         while(matcher.find()) {
            count++;
            String capitalizedWord = matcher.group(1);
            System.out.println("\t"+count+" : "+capitalizedWord);   // remove if you don't want to see the matches
         }
         return count;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多