我正在尝试创建一个简单的程序,该程序通过循环遍历每个字符并在字符为大写时递增累加器变量来对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?
答案 0 :(得分:4)
作为补充信息(出于您的学习目的),您可以使用以下方法以不同方式解决它:
每种方式都有其优点或缺点。
带有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
语句即可。