【问题标题】:Count uppercase letters in a string计算字符串中的大写字母
【发布时间】:2019-03-23 18:19:55
【问题描述】:

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

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++ 两次。这导致字母被跳过。这似乎是一个错字。
  • 这是我在这个网站上感受到的最愚蠢的......谢谢。我应该结束这个问题吗?
  • 我投票关闭它是一个错字,但现在有了答案,你将无法删除它。

标签: java string char


【解决方案1】:

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

  • λ,
  • '经典'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;
}

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

带正则表达式

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

【讨论】:

  • 超越和非常有见地!谢谢。
【解决方案2】:

删除第二个i++。这应该可以。

【讨论】:

    【解决方案3】:

    为什么要在 if 条件内增加 i++。 i 的值将使用 for 循环自动递增。

    【讨论】:

      【解决方案4】:

      for 循环for(int i = 0; i &lt; str.length(); i++) 中,您已经使用i++ 增加i 的值,但您又将i++ 放入for 循环中。所以i 的值将增加两次。这就是为什么你得到错误的输出。只需删除if 语句后的i++ 语句即可。

      【讨论】:

        猜你喜欢
        • 2020-01-04
        • 2013-08-10
        • 2020-08-28
        • 2011-10-02
        • 2014-10-03
        • 2017-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多