计算字符串中的大写字母

时间:2019-03-23 18:19:55

标签: java string char

我正在尝试创建一个简单的程序,该程序通过循环遍历每个字符并在字符为大写时递增累加器变量来对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?

4 个答案:

答案 0 :(得分:4)

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

  • 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;
}

其他帖子中已经有一些解释,例如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();
}

答案 1 :(得分:2)

删除第二个i++。这应该起作用。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

CMAKE_REQUIRED_DEFINITIONS循环const msgByAuthor = (messages, author) => { const regex = new RegExp('(.+)\\s'+ author +':(.*)', "gm"); return messages.match(regex); } const messages = `Put messages here`; console.log(msgByAuthor(messages, 'C')); // Array ["[19/12/17 16:31:36] C: Hola!! ☺", "[19/12/17 16:37:23] C: Hola❗❗❗"] 中,您已经在使用for来递增for(int i = 0; i < str.length(); i++)的值,但是您已经将i放入了i++循环中再次。i++的值将增加两次。这就是为什么输出错误的原因。只需在for语句之后删除i语句即可。