2013-10-17 64 views
1

假設我有一個類似「MikeJackson」的字符串,我試圖找出一種方法在兩者之間放置一個空格,使其成爲「邁克傑克遜」。然後對另一個字符串應用相同的方法說「JohnBull」會讓我回到「John Bull」。這是我想出了代碼:在字符串中放置一個空格

public class Test{ 

    public Test(){ 

    } 
public void sep(String s){ 
    s = s + " "; 
    char[] charArray = s.toCharArray(); 
    int l = s.length(); 
for (int i = 0; i < l; i++){ 
    char p = ' '; 

    if(Character.isUpperCase(s.charAt(0))){ 
     continue; 
    } 
    else if (Character.isUpperCase(s.charAt(i))){ 
     int k = s.indexOf(s.charAt(i)); 
     charArray[l] = charArray[--l]; 
     charArray[k-1] = p; 
    } 
    //System.out.println(s.charAt(i)); 
} 
} 
    public static void main (String args[]){ 

    Test one = new Test(); 

    one.sep("MikeJackson"); 
    } 
} 

我的想法是一個空間添加到字符串,使「MikeJackson」變成了「邁克·傑克遜」,然後在地方的字符向右移(檢查哪裏我發現一個大寫字母)忽略第一個大寫字母。然後在角色'J'的位置放置一個角色'',但將'J'移至右側。這就是我想用我的方法實現的,但看起來我需要一些指導。如果有人可以幫忙。謝謝。

+0

http://stackoverflow.com/questions/2559759/how-do-i-convert-camelcase-into-human-readable-names-in-java – Prabhakaran

回答

16

試試這個:

"MikeJackson".replaceAll("(?!^)([A-Z])", " $1"); 

對於每一個字符上我之前我加空格。

此外,它可以處理多個大寫單詞。 我得到Word1 Word2 Word3Word1Word2Word3

+0

我喜歡這一個最好的 – Cruncher

+0

解決方案是優雅的,:-D – raffian

+0

你可以使用(A-Z)(?!^)來防止它匹配字符串中的第一個字母。那麼你將不必使用.trim() – Nathanial

0

字符串是finalimmutable,您不能修改它,您將始終使用它來創建一個新的並分配給任何變量。正如說,我會建議尋找第一個非零索引大寫,得到它所在的子字符串,存儲兩個子字符串,並添加和之間的空間。

+4

這是一種誤導。字符串是最終的並不意味着我不能這樣做:'String s =「1」; S + = 「2」;'。這只是意味着我無法擴展它 – Cruncher

1

類似的問題在這裏: Insert Space After Capital letter

嘗試一下,如果您有任何問題,請告訴我們!

從參考的代碼是在這裏:如果接下來的文字是大寫

String s = "HelloWorldNishant"; 
    StringBuilder out = new StringBuilder(s); 
    Pattern p = Pattern.compile("[A-Z]"); 
    Matcher m = p.matcher(s); 
    int extraFeed = 0; 
    while(m.find()){ 
     if(m.start()!=0){ 
      out = out.insert(m.start()+extraFeed, " "); 
      extraFeed++; 
     } 
    } 
    System.out.println(out); 
+0

當然,我必須學習正則表達式,omg – RamonBoza

+0

是的,你有:) –

+0

這是一個優秀和優雅的解決方案。不瞭解「模式」和「匹配器」會使事情變得艱難。感謝大家。 – Emanuel

4
public static void sep(String s) { 
    StringBuilder result = new StringBuilder(); 
    for (int i = 0; i < s.length(); i++) { 

     result.append(s.charAt(i)); 
     if (i != s.length() -1 && Character.isUpperCase(s.charAt(i + 1))) { 
      result.append(" "); 
     } 
    } 
    System.out.println(result); 
} 

只需添加一個空格。

+0

在這裏坐了幾分鐘思考一個正則表達式的解決方案,但這可能是最簡單的 – Cruncher

+0

工作時,考慮到時間和內存,你的方法是非常糟糕的,但我會投票。 – RamonBoza

+0

@Cruncher:那麼最後一個字符不會被添加。您以前的評論是有效的,但我已經將它們合併。 –

0

去圓這個,在這種情況下,最簡單的方法是使用正則表達式

String str = "MikeJackson"; 
    System.out.println(str.replaceAll("(\\w+?)([A-Z])(\\w+?)", "$1 $2$3")); 

產量:Mike Jackson

1

使用String.replaceAll

String foo = "SomeLongName"; 
System.out.println(foo.replaceAll("([a-z]+)([A-Z])", "$1 $2")); 

結果Some Long Name

+1

+1因爲這不會將「Mike \ sJackson」變成「Mike \ s \ sJackson」(\ s是空格,所以不允許我放置雙空格) – Cruncher

+0

它不適用於所有情況。 Word1Word2Word3就是一個例子,1不是小寫字符,它不會在1和W之間加一個空格。 –

+0

@SilviuBurcea好吧,OP沒有建議名稱可以有數字。順便說一句,你可以說'string.replaceAll(「([a-z0-9] +)([A-Z])」,「$ 1 $ 2」)''爲例。 – devnull

0
public static String addSpaces(String str) { 
    StringBuilder sb = new StringBuilder(); 
    if (str.length() == 0) return ""; 
    sb.append(str.charAt(0)); 
    for (int i = 1; i < str.length(); i++) { 
     if (Character.isUpperCase(str.charAt(i))) sb.append(" "); 
     sb.append(str.charAt(i)); 
    } 
    return sb.toString(); 
} 
0
public class Test{ 

    public Test(){ 

    } 
public void sep(String s){ 
    s = s + " "; 
    char[] charArray = s.toCharArray(); 
    int l = s.length(), flag=0; 
    char temp1=' ',temp2=' '; 
for (int i = 0; i < l; i++){ 

    if (Character.isUpperCase(s.charAt(i))){ 
     if(i==0) 
      continue; 
     for(int j = i; j < l; j++) 
     { 
      if(temp1==' ') 
      { 
      temp1=charArray[j]; 
      charArray[j]=' '; 
      continue; 
      } 
      else if(temp2==' ') 
      { 
      temp2=charArray[j]; 
      charArray[j]=temp1; 
       continue; 
      } 
      else 
      { 
       if(flag==0) 
       { 
       temp1=charArray[j]; 
       charArray[j]=temp2; 
       flag=1; 
       continue; 
       } 
       temp2=charArray[j]; 
       charArray[j]=temp1; 
      } 

      charArray[j]=temp2; 

      } 





    } 
    // 
} 

String result= String.valueOf(charArray); 
System.out.println(result); 
} 
    public static void main (String args[]){ 

    Test one = new Test(); 

    one.sep("MikeJackson"); 
    } 
}**strong text** 
+0

上面的代碼會給你想要的輸出 –

相關問題