我正在尝试创建一个简单的程序,该程序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);
Run Code Online (Sandbox Code Playgroud)
运行此代码时输出:
J
S
i
Uppercase characters: 2
Run Code Online (Sandbox Code Playgroud)
是什么导致了这个输出?“JuSTin”中的“u”、“T”和“n”在哪里?为什么upperCaseCount等于2而不是3?
作为补充信息(为了您的学习目的),您可以使用以下不同方式解决它:
这些方式中的每一种都有自己的优点或缺点。
使用 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
}
Run Code Online (Sandbox Code Playgroud)
使用经典的 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;
}
Run Code Online (Sandbox Code Playgroud)
使用新的循环结构(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;
}
Run Code Online (Sandbox Code Playgroud)
其他帖子中已经有一些解释,例如大写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;
}
Run Code Online (Sandbox Code Playgroud)
如果您有兴趣深入挖掘,请查看这个有趣的 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();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2070 次 |
| 最近记录: |