【问题标题】:How to count uppercase words in a string in Java?如何在Java中计算字符串中的大写单词?
【发布时间】:2016-05-05 18:02:36
【问题描述】:

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

我已经尝试并写下了这样的内容:

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

    }

    return count;

}

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

【问题讨论】:

  • 编写多个检查或复杂的 if 语句有什么问题?
  • 分解问题。 ??? 部分有什么内容?可能是这样的,“如果这是一个大写单词,则递增计数器。”所以写下那个条件,替换为“这是一个大写的单词吗?”使用返回布尔值的方法。现在您需要实现该方法,但这是一个更容易解决的问题。
  • @Brian 只要有更简单的解决方案,我宁愿坚持下去,奥卡姆的胜利法则!无论如何,我已经设法找到了一个满意的答案,感谢您的关注!
  • 这可能听起来很刺耳,如果确实如此,我深表歉意,这不是本意……但如果这个问题是您需要帮助的问题,那么您实际上可能会从做事的一些练习中受益“硬”的方式(即,不依赖于编写正则表达式解析器的人为您解决了问题等)。
  • @yshavit 是的,我并不是说我不需要练习,这样说我会很愚蠢,但我被困在这个问题上(一个简单的问题,必须承认)几个小时,因为我上一次用 Java 写东西是在两年前,我几乎什么都不记得了。我需要重新获得程序员的心态,堆栈溢出可以帮助我达到那个目标,这就是为什么我首先发布了这样一个问题:)

标签: java count word uppercase


【解决方案1】:

您可以通过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 写过任何东西了。 :D
  • s == s.toUpperCase() 应该是s.equals(s.toUpperCase()) 在字符串已经是大写的情况下,JDK 7 中的实现确实会返回this;但是方法合同中没有指定这种行为,所以我个人不想依赖它。 (特别是因为String#equals fast-tracks 在两个实例相同时返回 true,无论如何。)
  • 好点。很久没有写Java了,我会相应地更新它。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    这是使用 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()))
    

    【讨论】:

    • 在我的编辑中尝试第一种方法,抱歉第二种方法是在条目中计算大写字母
    • 我不习惯 Java 8,你能评论一下你写的那些方法吗?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    相关资源
    最近更新 更多