如何计算 Java 中字符串中的大写单词?

How to count uppercase words in a string in Java?

我需要计算一个字符串中大写单词的总数,但如果不涉及复杂的 if 语句和检查,我不知道该怎么做。

我试过写下这样的东西:

private int uppercaseWordsCount(String input){
    count = 0;
    String[] ss = input.split("\s");
    for (String s: ss){
        //???
        }

    }

    return count;

}

而且我仍然不知道有什么好的条件可以满足我的需要。问题是我必须处理整个单词(出于该方法的目的,像感叹号这样的特殊字符算作大写字符)而不是单个字符,因为我正在编写的系统的其余部分已经这样做了。

您可以通过 split() 调用拆分每个字符串,就像您当前正在做的那样,以获得每个单词。此时,您可以选择如何处理比较每个单词以确定它们是否大写。

将您的字符串与大写版本进行比较

您还可以使用 toUpperCase() 方法将字符串与其对应的大写字母进行比较,并相应地递增

// The string is the same as an upper-cased version of itself
if(s.equals(s.toUpperCase())){
     // Then increment your count
     count++;
}

根据正则表达式检查字符串

您还可以使用正则表达式通过 matches() 方法查看字符串中的所有字符是否均为大写:

// Increment your count if the string consists of only uppercase characters
if(s.matches("^[A-Z]+$")){
     count++;
}

这是使用 java 8

的方法
public static long countUpperCaseWord(String input) {
  // your object must be not null
  Objects.requireNonNull(input);

  // new stream of the array returned by the split call on input string
  return Stream.of(input.split("\s")) 
               // we create a second stream that match the predicate passed throw the method filter
               .filter(word -> word.equals(word.toUpperCase())) 
               // finally we want to count how many words match this predicate
               .count();
}

如果需要在条目中计算大写字母:

  public static long countUpperCase(String input) {

     return input.chars()
                 .map(i -> (char) i)
                 .filter(c -> Character.isUpperCase(c))
                 .count();
  }

如果您想使用更多泛型代码来改进它,您可以这样写:

 public static long countWordsUsingPredicate(String input, Predicate<String> predicate) {
    Objects.requireNonNull(input);

    return Stream.of(input.split("\s")) 
                 .filter(predicate) 
                 .count();
}

并通过将谓词作为 lambda 表达式传递给方法来调用此 util 方法:

countUpperCaseWord("THIS BREAK", word -> word.equals(word.toUpperCase()))

简单的方法是定义您的 "upper case word pattern",然后根据它计算匹配项:

Pattern pattern = Pattern.compile("\b[A-Z\!\@$\%\^\&\*\(\)\[\]]\S+\b");
Matcher matcher = pattern.matcher("Your Input String Here");
int count = 0;
while (matcher.find()) { count++; }
System.out.printf("%d uppercase words.%n", count);