【发布时间】:2016-10-21 13:35:28
【问题描述】:
看看你们能不能解决这个问题。我用 Java 编写了一个标题大写程序,该程序可以接受一串 ASCII 字符并将所有单词(仅由字母 A-Z 或 a-z 组成的子字符串)转换为标题大小写。所以字符串“#@hello!_world$”变成了“#@Hello!_World$”。但是这个程序拒绝正确翻译字符串第一个索引处的非字母,尽管我尽了最大的努力来纠正它。
public static String LetterCapitalize(String str) {
String newStr = "";
System.out.println(newStr);
for (int i = 0; i < str.length(); i++) {
// if first character is a letter and not uppercase
if (i == 0 && (!isUpperCase(str.charAt(i)))) {
Character m = (char) ((int) str.charAt(i) - 32);
newStr = newStr + m;
} // if first character is a letter and uppercase
else if (i == 0 && (isUpperCase(str.charAt(i)))) {
Character m = str.charAt(i);
newStr = newStr + m;
} // if first character is not a letter
else if (i == 0 && (!isLetter(str.charAt(i)))) {
Character m = str.charAt(i);
newStr = newStr + m + m;
} // if character is first letter in a word
else if (!isLetter(str.charAt(i - 1)) && isLetter(str.charAt(i)) && !isUpperCase(str.charAt(i))) {
Character m = (char) ((int) str.charAt(i) - 32);
newStr = newStr + m;
} // all other
else {
Character m = str.charAt(i);
newStr = newStr + m;
}
}
return newStr;
}
public static boolean isUpperCase(char c) {
boolean isCap;
if (c >= 'A' && c <= 'Z') {
isCap = true;
} else {
isCap = false;
}
return isCap;
}
public static boolean isLetter(char c) {
boolean isLetter;
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
isLetter = true;
} else {
isLetter = false;
}
return isLetter;
}
【问题讨论】:
-
您能否给我们一些输入示例以及您期望得到的输出以及实际得到的结果(错误)。
-
在上面的示例中,我输入“#@hello!_world$”,期望程序返回“#@Hello!_World$”。但是,实际上程序返回“□@Hello!_World$”。显然这是输出字符串的错误第一个字符。
-
这一行是错误的: if (i == 0 && (!isUpperCase(str.charAt(i)))) { - 它假定它是一个小写字母。你需要看看它是否是一个小写字母。并非所有非大写字符都是字母。
标签: java string non-ascii-characters