首页 > 解决方案 > 计算字符串中的大写字母

问题描述

我正在尝试创建一个简单的程序,String通过循环遍历每个字符并在字符为大写时递增累加器变量来计算 a 中的大写字符。这是我的代码:

String str = "JuSTin"; //3 uppercase characters
int upperCaseCount = 0; //increment each time an uppercase character is encountered
char character; //the current character
for(int i = 0; i < str.length(); i++)
{
  character = str.charAt(i);
  System.out.println(character); //Log all characters to console just to see what is going on
  if(Character.isUpperCase(character))
      upperCaseCount++; 
  i++;  
}
System.out.println("Uppercase characters: " + upperCaseCount);

运行此代码时输出:

J
S
i
Uppercase characters: 2

是什么导致了这个输出?“JuSTin”中的“u”“T”和“n”在哪里?为什么upperCaseCount等于 2 而不是 3?

标签: javastringchar

解决方案


作为补充信息(出于您的学习目的),您可以使用以下方法以不同的方式解决它:

  • 拉姆达,
  • '经典' for 循环,
  • Java 7 中引入的循环构造,
  • 正则表达式,
  • 或 forEach 循环

这些方式中的每一种都有自己的优点或缺点。

有一个 lambda

public static long countUpperCase(final String str) {
        return str
                .chars() // get all chars from the argument
                .filter(c -> Character.isUpperCase(c)) // filter only the uppercase
                .count(); // count the uppercase
    }

带有经典的 for 循环

public static long countUpperCase(final String str) {
    long counter = 0;

    for(int i=0; i<str.length(); i++) {
        if(Character.isUpperCase(str.charAt(i))) {
            counter++;
        }
    }
    return counter;
}

使用新的循环结构(Java 7 或更高版本)

public static long countUpperCase(final String str) {
    long counter = 0;

    for(final char c: str.toCharArray()) {
        if(Character.isUpperCase(c)) {
            counter++;
        }
    }
    return counter;
}

其他帖子中已经有一些解释,例如大写SO帖子

使用正则表达式

public static long countUpperCase(final String str) {
    // \p{L} matches a single code point in the category "letter"
    // \p{L} matches all letters that are uppercase
    return str.split("(?=\\p{Lu})").length;
}

如果您有兴趣深入挖掘,请查看这个有趣的 PDF:Regexp 指南

使用 forEach 循环

public static long countUpperCase(final String str) {
    // the 'var' keyword can be used with Java 10 or higher
    final var counter = new AtomicInteger(0);

    // convert a string into a List<Character>
    // Note that this is only applicable since Java 8 or higher
    var chars = str
            .chars()
            .mapToObj(c -> (char) c)
            .collect(Collectors.toList());

    // count the number of uppercase letters
    chars.forEach(c -> {
        if(Character.isUpperCase(c)) {
            counter.incrementAndGet();
        }
    });

    return counter.get();
}

推荐阅读