使用Java划分和大写字符串中的单词

时间:2015-10-04 21:13:15

标签: java string

我正在为作业编写方法。

描述:如果一个字符串包含一个包含大写字母的单词,我的方法需要将整个单词大写。

所以“你好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 "

我想不出一种方法可以解决这个问题,而无需手动添加最后一个字符,这可能会导致此分配失效。我宁愿学习正确,有效的方法来解决这个问题(考虑到允许的方法),而不是努力提出原始解决方案。

你们中间有人会介意给我一些想法吗?我无法使用substringindexOf

4 个答案:

答案 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();
}