在一个字符串中计算大写字母的数量

3

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

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?

你重复使用了 i++,这会导致跳过字母。这似乎是一个笔误。 - Carcigenicate
这是我在这个网站上感到最愚蠢的时候...谢谢。我应该关闭这个问题吗? - justin
我投票将其关闭为错别字,但现在有了答案,你将无法删除它。 - Carcigenicate
4个回答

7

作为补充信息(供您学习用途),您可以使用以下不同方式解决它:

  • lambda表达式,
  • “经典”的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文档:正则表达式指南

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

1
超出预期并非常有见地!谢谢。 - justin

2

去掉第二个 i++。这样应该就可以了。


1
为什么在if条件语句中要使用i++自增运算符?使用for循环时,i的值会自动增加。

0
for 循环中,for(int i = 0; i < str.length(); i++),你已经使用 i++ 增加了 i 的值,但是你又把 i++ 放在了 for 循环里面。因此,i 的值会被增加两次。这就是为什么你得到错误的输出结果。只需在 if 语句后删除 i++ 语句即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接