2014-03-26 92 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在删除字符时不增加来完成此工作。我会让你进一步研究这些细节。