我正在为作业编写方法。
描述:如果一个字符串包含一个包含大写字母的单词,我的方法需要将整个单词大写。
所以“你好StackOverFlow,我的名字是John”会产生“你好STACKOVERFLOW,我的名字是JOHN”
我的代码:
/*Helper method for capitalizeWords() capitalizes word if necesarry*/
private static String capitalizeWord(String s, int position) {
int i = position;
String word = "";
String testWord = "";
while (s.charAt(i) != ' ' && i < s.length() - 1) {
word += s.charAt(i);
i++;
}
word += " ";
testWord = word.toLowerCase();
if (!testWord.equals(word)) {
word = word.toUpperCase();
}
return word;
}
public static String capitalizeWords(String s) {
StringBuilder newString = new StringBuilder();
if (s.length() == 1) {
newString.append(s.charAt(0));
return newString.toString();
}
for (int i = 0; i < s.length(); i++) {
if (i == 0) {
newString.append(capitalizeWord(s, i));
} else if (s.charAt(i) == ' ') {
newString.append(capitalizeWord(s, i + 1));
}
}
return newString.toString();
}
正如您所看到的,我的代码效率低下,并且在运行时会跳过字符串的最后一个字符:
HW2.capitalizeWords("Guess what?? There are twenty-sIx letters in the English alphABEt!")
"GUESS what?? THERE are TWENTY-SIX letters in the ENGLISH ALPHABET "
我想不出一种方法可以解决这个问题,而无需手动添加最后一个字符,这可能会导致此分配失效。我宁愿学习正确,有效的方法来解决这个问题(考虑到允许的方法),而不是努力提出原始解决方案。
你们中间有人会介意给我一些想法吗?我无法使用substring
或indexOf
。
答案 0 :(得分:2)
关于跳过最后一个字符,请检查你的while循环:
while(s.charAt(i) != ' ' && i <s.length()-1)
{
word += s.charAt(i);
i++;
}
你正在循环直到s.length()-1
但不包括它,所以你将丢失一个角色。请尝试使用s.length()
。如果您想使用s.length()-1
,则需要使用i <= s.length()-1
。
然后你需要编辑你的while循环,因为你在调用s.charAt(i)
时会遇到异常,如果你这样做的话。
将循环更改为while(i < s.length() && s.charAt(i))
- 如果第一部分不为真,则不会评估第二部分,因此您将避免此错误。
答案 1 :(得分:1)
你其实非常接近。您需要进行两项更改。
首先,你在循环中迭代过少的字符。您希望一直前往i < s.length()
,而不是s.length() - 1
。
但是,如果您只是进行了更改,那么s.charAt(i)
语句会出现问题,因为i
将在下一个循环中超出范围。
要绕过 ,请翻转&&
:
while (i < s.length() && s.charAt(i) != ' ') {
word += s.charAt(i);
i++;
}
由于&&
短路,如果i >= s.length()
,您将无法评估其第二部分。
答案 2 :(得分:1)
您可以简化代码并利用Character
中的实用程序方法(例如isWhitespace(char)
和isUpperCase(char)
)。我还建议使用for-each
loop。然后你可以建立一个单独的单词。像,
public static String capitalizeWords(String s) {
StringBuilder sb = new StringBuilder();
StringBuilder word = new StringBuilder();
boolean capital = false;
for (char ch : s.toCharArray()) {
if (Character.isWhitespace(ch)) {
if (word.length() > 0) {
sb.append(capital ? word.toString().toUpperCase() : word);
word.setLength(0);
capital = false;
}
sb.append(ch);
continue;
} else if (Character.isUpperCase(ch)) {
capital = true;
}
word.append(ch);
}
if (word.length() > 0) {
sb.append(capital ? word.toString().toUpperCase() : word);
}
return sb.toString();
}
我用
测试过System.out.println(capitalizeWords("Guess what?? There are twenty-sIx letters "
+ "in the English alphABEt!"));
System.out.println(capitalizeWords("hello StackOverFlow, my name is John"));
获得(预期)
GUESS what?? THERE are TWENTY-SIX letters in the ENGLISH ALPHABET!
hello STACKOVERFLOW, my name is JOHN
答案 3 :(得分:0)
我相信以下代码可以帮助您完成任务。
public String capitalize(String sentence) {
String[] words = sentence.split(" ");
for (int i = 0; i < words.length; ++i) {
String word = words[i];
for (int j = 0; j < word.length(); ++j) {
if (Character.isUpperCase(word.charAt(j))) {
words[i] = words[i].toUpperCase();
break;
}
}
}
StringBuffer result = new StringBuffer();
for (String word : words) {
result.append(word).append(" ");
}
return result.toString();
}