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

如何在Java中计算字符串中的大写单词?,java,count,word,uppercase,Java,Count,Word,Uppercase,我需要计算字符串中大写单词的总数,但如果没有复杂的if语句和检查,我就无法计算出如何进行 我试着写下这样的东西: private int uppercaseWordsCount(String input){ count = 0; String[] ss = input.split("\\s"); for (String s: ss){ //??? } } return count; } 我仍然不知道有什么好的条件可以

我需要计算字符串中大写单词的总数,但如果没有复杂的if语句和检查,我就无法计算出如何进行

我试着写下这样的东西:

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

    }

    return count;

}

我仍然不知道有什么好的条件可以满足我的需要。问题是,我必须处理整个单词(特殊字符,如感叹号,在方法中被视为大写字符),而不是单个字符,正如我正在编写的系统的其他部分所做的那样

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

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

您还可以使用相应的方法和增量将字符串与其大写等效值进行比较

// The string is the same as an upper-cased version of itself
if(s.equals(s.toUpperCase())){
     // Then increment your count
     count++;
}
对照正则表达式检查字符串

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


这是如何使用Java8实现的

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

简单的方法是定义“大写单词模式”,然后对匹配项进行计数:

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

写多个检查或复杂的if语句有什么问题?请分析问题。
部分中有什么内容?可能类似于“如果这是一个大写单词,则递增计数器。”所以写下该条件,用返回布尔值的方法替换“这是一个大写单词吗?”。现在你需要实现这个方法,但这是一个更简单的问题。@Brian只要有更简单的解决方案,我宁愿坚持下去,Occam的胜利剃刀!无论如何,我已经找到了一个令人满意的答案,谢谢你的关注!这听起来可能很刺耳,如果是这样,我很抱歉,这不是我的本意。。。但是,如果这个问题是你需要帮助的,那么你实际上可能会受益于以“艰难”的方式进行一些练习(例如,不依赖编写正则表达式解析器的人为你解决了问题等等)。@yshavit True,我不是说我不需要练习,我说这样的话是愚蠢的,但是我被这个问题困扰了好几个小时(必须承认,这是一个简单的问题),因为我上一次用Java写东西是两年前,我几乎什么都不记得了。我需要再次获得程序员的心态,堆栈溢出可以帮助我达到这个目标,这就是为什么我首先提出这样一个问题:)这么简单吗?非常感谢你!正如您所看到的,我已经积攒了一些锈迹,因为我已经好几年没有用Java编写任何东西了D
s==s.toUpperCase()
可能应该是
s.equals(s.toUpperCase())
如果字符串已经是大写,JDK 7中的实现确实会返回
this
;但是这种行为并没有在方法契约中指定,所以我个人不想依赖它。(特别是因为
String#等于
fast tracks,如果两个实例相同,则返回true。)这一点非常重要。我已经很久没有写任何Java了,我会相应地更新它。在我的编辑中尝试第一种方法,对不起,第二种方法是在条目中用大写字母计数。我不习惯Java 8,你能评论一下你写的那些方法吗?非常感谢。
countUpperCaseWord("THIS BREAK", word -> word.equals(word.toUpperCase()))
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);