2015-10-04 69 views
1

我在寫一個賦值方法。用Java劃分和字符串中的單詞

描述:如果一個字符串包含一個包含大寫字母的單詞,我的方法需要大寫整個單詞。

所以「你好計算器,我的名字是約翰」將產生「你好計算器,我的名字是約翰」

我的代碼:

/*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

+0

我會看看使用.split方法並提供一個空格作爲參數。看到這裏:http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String) –

+0

是的開始與分割字符串的字或者字符串.split或一個StringTokenizer。然後,您可以檢查每個單詞的第一個字符,以決定是否必須將其大寫。 – hotzst

+1

@hotzst不一定是第一個,任何角色。 – Tunaki

回答

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

如果你這樣做,你會得到一個'StringIndexOutOfBoundsException'。 – Makoto

+0

我剛剛添加,當我看到你的答案:) – helencrump

+0

我以前試過,但收到以下error.java.lang.StringIndexOutOfBoundsException:字符串索引超出範圍:67 – JDI

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()第二部分。

+0

謝謝我欣賞它! – JDI

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 
+0

我真的很感謝這個解決方案。不幸的是,我們不允許在循環中使用「繼續」。另外,我們不允許使用數組。我的教授似乎認爲它是用來補償設計不佳的循環,但我個人在我的代碼中使用過它,從來沒有遇到過問題。 – JDI

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