java - 计算字符串中的大写字母
问题描述
我正在尝试创建一个简单的程序,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?
解决方案
作为补充信息(出于您的学习目的),您可以使用以下方法以不同的方式解决它:
- 拉姆达,
- '经典' 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();
}
推荐阅读
- java - 无法从另一个活动将项目添加到回收站视图中
- reactjs - reactjs在网格之间拖放不起作用
- c++ - 使用 C++ 从数字中获取 x 到 y 位
- javascript - href 目标选项卡应首先打开一个选项卡并在第二次更新
- javascript - 根据输出 JSON 模式从输入 JSON 消息生成输出 JSON 消息
- javascript - 如何在 tensorflow.js 中截断 coco ssd 模型?
- python - 继承自 UserCreationForm 的注册表单中的密码不匹配
- python-3.7 - 如何阻止不和谐的机器人响应自身 - 如果语句不起作用则返回
- image - For 循环被忽略
- react-native - 我如何从 react-native 中的另一个 js 文件访问变量