Java 从字符串中删除字符[i]

Java 从字符串中删除字符[i],java,string,comparison,Java,String,Comparison,正在尝试从S1中删除字符串S2中的所有字符。例如:S1=密西西比河,S2=is。返回值将是S1,它将是Mpp服务器 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中删除字符串S2中的所有字符。例如:S1=密西西比河,S2=is。返回值将是S1,它将是Mpp服务器

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.
        }
    }
}

问题是remove all接受字符串param,而.remove接受char,两者都不起作用。我已经为此奋斗了一天,不能得到它,对努布兹有什么帮助吗?:)一如既往地非常感谢大家。

简单一点的:

return S1.replace(S2, "");
请注意,您的示例不起作用:
密西西比河
变为
Mssippi河

如果确实要删除所有
i
s和
s
s,可以使用正则表达式:

return S1.replaceAll("[" + S2 + "]", "");
它返回
Mpp-server
——它假定
s2
不包含任何特定于正则表达式的字符。

使用此函数处理正则表达式的特殊字符,并将
s2
视为文字模式

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

Mpp Rver

String类是不可变的,因此一旦创建了String对象,就不能更改它。

一种简单的方法是:

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();
}
publicstaticstringremoveletter(stringsource,stringletterstoremove){
StringBuilder=新的StringBuilder();
对于(int i=0;i
或:

publicstaticstringremoveletter(stringsource,stringletterstoremove){
对于(int i=0;i
虽然使用正则表达式的方法在许多情况下都会起作用,但您需要做更多的工作,使它们能够抵抗
lettersToRemove
中的“-”之类的东西。这取决于你的要求。(正如Sabuj在回答中所指出的,
模式。在这里引用
可能就足够了……但我想用一些奇怪的例子来验证这一点。)

试试正则表达式:

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

使用正则表达式删除S1中S2中的所有字母

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

这有几个原因:

S1.charAt(j) = ""; //this does not work but essentially what i want.
不起作用:(1)不能将函数调用用作赋值的左侧;(2) 即使可以,这里也没有意义,因为
charAt()
返回
char
,并且不能将
char
分配给
字符串
;(3) 
String
s是不可变的,因此无论如何,您不能只更改
S1
的一个字符。您必须创建一个新字符串并为其分配
S1
。[还有(4):
j
从0变为
S2.length()
,而不是
S1.length()
,这意味着
j
应该用作
S2
的索引,而不是
S1
]

像其他答案所建议的那样使用
replaceAll
是最简单的。如果不允许,您可以使用您想要的字符构建新字符串,而不是删除您不想要的字符(例如,使用
StringBuilder
;参见Jon Skeet的答案)

或者,您可以使用
子字符串
从字符串中删除字符,方法是计算字符前后的子字符串并将其连接起来。要删除
S1
i
第个字符(位于
S1.charAt(i)
),您可以说

S1 = S1.substring(0, i) + S1.substring(i + 1);
第一个
子串
S1
的字符,最多(但不包括)
(i)
;第二个是从
i+1
的第个字符开始到字符串末尾的字符


但是,如果没有其他更改,就无法将其放入循环中。原因是您有一个贯穿
S1
字符的索引,但您刚刚更改了
S1
,因此许多索引是不同的。通过使索引在字符串中向后移动,或者如果删除字符,则确保
i
不会递增,可以实现这一点。我将让您进一步研究并解决细节。

首先阅读
字符串
javadoc。但这不是他想要的。他希望
Mpp服务器
-从
S1
中删除
S2
的所有字符,OP要求从S1中删除S2中的所有字符,不是S1中的S2字符串。@sushain97好的,我误解了问题-已编辑。很高兴确认我仍然记得如何使用Java。如果替换字符串包含破折号之类的内容,那就不行了…@JonSkeet谢谢,你是对的。这就是为什么我在回答中提到了特殊角色。啊,我没有发现。我想我还是更愿意使用一种更通用的方法——我认为这有点像连接SQL参数:)
Pattern.quote()
将处理特殊字符问题,对吗?我想是这样的。在Java8中,使用
\Q
\E
的行为似乎已经发生了变化。我需要更详细地检查。如果要删除的字母等于is,则第二个代码段无法同时删除I和s。@staticx:这就是用C#和Java编写的“乐趣”——我知道
substring
在一个平台上需要计数,在另一个平台上需要结束索引,但有时我会弄错……是的,我必须亲自去检查子字符串定义,看看我是否遗漏了一些东西,因为它看起来很奇怪。对于下层选民来说,把你们的事实弄对。。字符串是常量;它们的值在创建后无法更改。字符串缓冲区支持可变字符串。因为字符串对象是不可变的,所以可以共享它们。。。上面的句子不是我的。它来自oracle文档。去读些书。。我甚至在这里发布链接供您参考
public static String removeLetters(String S1, String S2){
    return S1.replaceAll("[" + S2 + "]", "");
}
S1.charAt(j) = ""; //this does not work but essentially what i want.
S1 = S1.substring(0, i) + S1.substring(i + 1);