2012-02-15 35 views
2

我有這個Java函數應該將字符串s轉換爲標題大小寫。它應該返回拷貝s給呼叫者,保留sJava toTitleCase函數

當前,rv以空字符串結尾。誰能告訴我爲什麼?

private static String titleCase(String s) { 
     String rv = new String(); 
     StringTokenizer strtok = new StringTokenizer(s); 
     // handle the potential null error: (should really output a runtime warning here) 
     if(s == null) return null; 
     while(strtok.hasMoreTokens()) { 
      String word = strtok.nextToken(); 
      String firstLetter = word.substring(0,1); 
      String restOfWord = word.substring(1); 
      rv.concat(firstLetter.toUpperCase() + restOfWord.toLowerCase()); 
     } 
     return rv; 
    } 
+0

如果你正在做空檢查(或拋出異常),你應該先做這件事,在方法中的_anything_ else之前;爲什麼要創建'StringTokenizer'如果它不會被使用? (儘管優化器可能足夠聰明以重新排序,但它對維護程序員來說會更好) – 2012-02-15 21:41:46

+0

因爲我是C程序員。我無法打破在代碼之前放置變量聲明的習慣。不過,謝謝你指出,我應該重新排序。 – 2012-02-15 21:50:13

回答

4

字符串在Java中是不可變的,一旦你已經宣佈RV爲「」(=新的String()),它不會改變,除非你分配一個新的String它。 您可以通過更換CONCAT行:

rv = rv.concat(firstLetter.toUpperCase() + restOfWord.toLowerCase()); 

或者更好,而不是使用一個String(未測試)一個StringBuilder:

StringBuilder rv = new StringBuilder(); 
// [...] 
rv.append(firstLetter.toUpperCase()).append(restOfWord.toLowerCase()); 
// [...] 
return rv.toString(); 
+0

謝謝,這工作。我不得不稍微修改它來放回空格,但無論如何我必須這樣做。 – 2012-02-15 14:10:05

0
+0

如果您可以編輯一個如何使用它的例子,我會考慮切換接受的答案。就目前而言,這不像其他答案那樣有用。感謝您的輸入,但:) :) – 2012-02-16 10:28:29

+0

鏈接的javadoc上有一些例子。你檢查過了嗎? :-) – palacsint 2012-02-16 23:20:00

+0

是的,我沒有檢查javadoc,它只給我一個額外的問題 - 這個解決方案不需要額外的庫包括/依賴?添加依賴項似乎有點小問題,所以我寧願推出自己的解決方案。 – 2012-02-17 09:33:42