2014-03-26 120 views
-1

嘗試從S1刪除字符串S2中的所有字符。例如:S1 =密西西比河,S2 = is。返回將是S1,它將是Mpp Rver。從字符串中刪除字符[i]

public static String removeLetters(String S1, String S2){ 
    for(int i=0;i<S1.length();i++){ 
     for(int j=0;j<S2.length();j++){ 

      if(S2.charAt(i) == S1.charAt(j)) 
       S1.charAt(j) = ""; //this does not work but essentially what i want. 
     } 
    } 
} 

我已經試過

String S1 = S1.removeAll 

S1 = S1.remove 

的問題是,刪除所有需要一個字符串字符串PARAM和卸下襬臂採用炭炭,這兩者都不工作。我打了一天,不能得到它,任何幫助noobz? :)非常感謝大家一如既往。

+1

首先閱讀'String' javadoc。 –

回答

2

如何更簡單:

return S1.replace(S2, ""); 

請注意,例如不工作:Mississippi River成爲Mssippi River

如果你真的要刪除所有i S和s S,你可以使用正則表達式:

return S1.replaceAll("[" + S2 + "]", ""); 

返回Mpp Rver - 即假設s2不包含任何特定的正則表達式的字符。

+1

但這不是他想要的。他希望'Mpp Rver' - 從'S1' – AKS

+0

OP中刪除的'S2'的所有字符要求從S1中刪除S2中的所有字符,而不是來自S1的字符串S2。 – sushain97

+0

@ sushain97好吧,我誤解了這個問題 - 編輯。 – assylias

1

Pattern.quote()一起使用此處理正則表達式特殊字符並將S2視爲字面模式。

String S1 = "Mississippi River"; 
String S2 = "is"; 
S1 = S1.replaceAll("["+Pattern.quote(S2)+"]+", ""); 
System.out.println(S1); 

輸出:

Mpp Rver 
+0

這不會很好,如果替換字符串包含像破折號雖然... –

+0

@JonSkeet謝謝,你是對的。這就是爲什麼我在我的答案中提到特殊字符。 –

+0

啊,我沒有發現。我想我寧願使用更通用的方法 - 我認爲這有點像連接SQL參數:) –

-2

String類是不可變的,使得它一旦建立一個字符串對象不能被改變。

+0

對於downvoters,讓事實正確.. 字符串是恆定的;它們的值在創建後無法更改。字符串緩衝區支持可變字符串。因爲字符串對象是不可變的,所以它們可以共享... 上面的句子不是我的。它來自oracle文檔。去讀一些書吧我甚至發佈鏈接在這裏供您參考 http://docs.oracle.com/javase/6/docs/api/java/lang/String.html – User27854

2

一個簡單的方法是這樣的:

public static String removeLetters(String source, String lettersToRemove) { 
    StringBuilder builder = new StringBuilder();   
    for (int i = 0; i < source.length(); i++) { 
     if (lettersToRemove.indexOf(source.charAt(i)) == -1) { 
      builder.append(source.charAt(i)); 
     } 
    } 
    return builder.toString(); 
} 

或者:

public static String removeLetters(String source, String lettersToRemove) { 
    for (int i = 0; i < lettersToRemove.length(); i++) { 
     source = source.replace(lettersToRemove.substring(i, i + 1), ""); 
    } 
    return source; 
} 

雖然使用正則表達式將在許多案件工作方法,你需要一個多一點的工作使其在lettersToRemove內對「 - 」之類的事物具有強大的威力。這真的取決於你的要求。 (正如Sabuj的回答指出,Pattern.quote可能是不夠這裏...但我想驗證自己能夠有一些怪異的情況下)。

+0

第二個代碼片段無法刪除我和s如果字母去除等於是。 – Brian

+0

沒關係,只是看到你的編輯:) – Brian

+0

@staticx:這是在C#和Java編寫的「快樂」 - 我知道'substring'需要在一個平臺中計數,在另一個平臺中需要一個結束索引,但有時候我會得到他們錯誤的方式... –

-1

嘗試正則表達式:

String pattern = "[" + S2 + "]"; // will take all chars from S2 to create a pattern. 
String result = S1.replaceAll(S2,""); //will replace any char from S2. 
0

使用正則表達式刪除S1中的所有S2中的字母。

public static String removeLetters(String S1, String S2){ 
    return S1.replaceAll("[" + S2 + "]", ""); 
} 
0

有幾個原因,這:

S1.charAt(j) = ""; //this does not work but essentially what i want. 

不工作:(1)不能使用函數調用作爲賦值的左側; (2)即使可以,在這裏也沒有意義,因爲charAt()返回char,並且您不能將char指定爲String; (3)String s是不可變的,所以你不能只是改變S1的一個字符。您必須創建一個新字符串並將它分配給S1。 [此外(4):j從0到S2.length(),不S1.length(),從而意味着j應使用作爲一個指數到S2,不S1。]

使用replaceAll作爲其他的答案都建議是最簡單的。如果你不被允許,你可以用做的想要的字符來建立一個新的字符串,而不是刪除那些你不想要的字符(例如,使用StringBuilder;參見Jon Skeet的回答)。

或者,您可以使用substring通過計算字符前後的子字符串並將它們連接起來,從字符串中刪除字符。要刪除i「日的S1的(在S1.charAt(i))字符,你可以說

S1 = S1.substring(0, i) + S1.substring(i + 1); 

第一substringS1字符最多,但不包括(i);第二個是起始於i+1'字符直到字符串末尾的字符。

但是,如果不進行其他更改,則無法將其放入循環中。原因是你有一個索引,通過S1的字符,但你剛剛改變S1,使許多指標是不同的。您可以通過使索引在字符串中向後移動或通過確保i在刪除字符時不增加來完成此工作。我會讓你進一步研究這些細節。