2013-03-17 36 views
1

我試圖寫一個代碼,這將使該輸出:plusOut代碼的Java

plusOut("12xy34", "xy") → "++xy++" 

返回如在原有的人物已被取代+除了在第2串在字符串中出現第一個字符串,但即時通訊有問題與我的代碼。這是:

public String plusOut(String str, String word) { 
    String newString = ""; 
    for (int i=0; i<str.length()-1; i++) { 
    if (str.substring(i, word.length()).equals(word)) { 
     newString = newString + str.substring(i, word.length()); 
    } 
    else { 
     newString = newString + "+"; 
    } 
    } 
    return newString; 
} 

回答

3

你的代碼有一些錯誤,請參閱評論。

public String plusOut(String str, String word) { 
    String newString = ""; 
    // iterate up to length() to catch the last char if word.length() is 1 
    for (int i = 0; i < str.length(); i++) { 
     // use min() to avoid an IndexOutOfRange 
     String sub = str.substring(i, Math.min(i+word.length(), str.length())); 
     if (sub.equals(word)) { 
      newString = newString + sub; 
      // skip remaining characters of word 
      i += sub.length()-1; 
     } 
     else { 
      newString = newString + "+"; 
     } 
    } 
    return newString; 
} 

除此之外,我會使用一個StringBuilder,而不是+操作。

+1

你可以做到這一點,而不子(見我的回答如下) 。但是經過測試和工作,+1用於更正原始代碼而不是從頭開始編寫。 – Joel 2013-03-17 14:48:35

+0

在循環內連接字符串通常是一個非常糟糕的想法,請嘗試使用'StringBuilder'。 – arshajii 2013-03-17 14:51:21

0

我能想到的最好和最簡單的方法是使用正則表達式並執行replaceAll。

一般的想法是讓第二個字符與正則表達式和替換字符一起構建正則表達式並替換爲正則表達式。

public String plusOut(String str, String word) { 

String regEx="[^"+Pattern.quote(word)+"]"; 

str.replaceAll(regEx,"+"); 

} 

請注意,Pattern.quote()將確保您的單詞不會擰緊正則表達式。

我沒有試過代碼,但它應該沒有問題。

+0

這是行不通的,'plusOne(「12xy12」)'返回'++ x +++' – beny23 2013-03-17 14:36:33

+0

有趣。它打破了JDK 1.5,但在1.6 ...罰款... – beny23 2013-03-17 15:23:21

+0

然而,它嘗試像'plusOne(「xxxyxx12yx12」)''返回'xxxyxx ++ yx ++'(與1.6) – beny23 2013-03-17 15:25:45

0

這會爲你做到這一點。

public String plusOut(String str, String word) { 

    if(!str.contains(word)){ 
     System.out.println("Word not found in string!"); 
     return "Ut-oh!"; 
    } 
    int indexOfStart = str.indexOf(word); 

    StringBuilder sb = new StringBuilder(); 
    for(int i = 0; i<indexOfStart; i++){ 
     sb.append('+'); 
    } 

    sb.append(word); 

    for(int i=indexOfStart+word.length(); i < str.length(); i++){ 
     sb.append('+'); 
    } 

    return sb.toString(); 
} 
1

你應該真的告訴我們你當前的代碼面臨哪些具體的問題。在任何情況下,這裏是我會怎麼做:

  • 拆分str上的word所有出現,形成String[]
  • 循環遍歷這個數組,並追加一些'+'字符到newString,對應於您所在數組的任何元素的長度。
  • 在相同的循環迭代中,將word附加到newString,除非您在數組的最後一個元素上。

這就是我的意思是:

public static String plusOut(String str, String word) { 
    StringBuilder newString = new StringBuilder(str.length()); 
    String[] split = str.split(word); 

    for (int i = 0; i < split.length; i++) { 
     for (int j = 0; j < split[i].length(); j++) 
      newString.append('+'); 

     if (i != split.length - 1) 
      newString.append(word); 
    } 

    return newString.toString(); 
} 

哦,只是還有一個小竅門:儘量避免在一個循環內追加到字符串反覆。如果需要,請改用StringBuilder


System.out.println(plusOut("12xy34", "xy")); 
 
++xy++ 
+0

正則表達式單行將除了''''''''''''無論'X'或'Y'會發生。所以'plusOne(「yyyy」)'會返回'「yyyy」',我不認爲它的用意是... – beny23 2013-03-17 15:28:08

+0

啊,是的,你是對的,我的錯誤。 – arshajii 2013-03-17 15:40:09

0

試試這個:

public static String plusOut(String word, String find) { 
    StringBuilder newStr = new StringBuilder(); 
    int start = word.indexOf(find); 
    if (start > -1) { 
     for (int i = 0; i < start; i++) { 
      newStr.append("+"); 
     } 
     newStr.append(find); 
     for (int i = 0; i < word.length() - (start + find.length()); i++) { 
      newStr.append("+"); 
     } 
    } 
    return newStr; 
} 
+1

如果你這樣做,最好使用字符串生成器,但看起來像一個很好的解決方案。 – ThePerson 2013-03-17 14:33:40

0

這麼多的答案!那麼,這裏的礦井,以及:在主

public static String plusOut(String str, String word) { 
    String output = ""; 
    int index = str.indexOf(word); // if -1 is returned, replace all chars 
    for (int i= 0; i < str.length(); i++) { 
     if(i == index) 
     { 
      output += word; 
      i += word.length() -1; // because i++ will still occurr 
      continue; 
     } 
     output += "+"; 
    } 
    return output; 
} 

和測試代碼:

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 
    String test = "somethinghello12345.1!#"; 
    System.out.println(test + " -> " + plusOut(test, "hello")); 

    test = "somethinghello12345.1!#"; 
    System.out.println(test + " -> " + plusOut(test, "not gonna work")); 
} 

會產生輸出繼電器:

somethinghello12345.1!# -> +++++++++hello+++++++++ 
somethinghello12345.1!# -> +++++++++++++++++++++++ 
+0

請注意,對於較大的字符串,建議使用'StringBuilder'。在這裏爲了簡單起見,我只使用了連接運算符。 – Joel 2013-03-17 14:36:54