从字符串中删除charAt [i]

时间:2014-03-26 17:31:30

标签: java string comparison

尝试从S1中删除字符串S2中的所有字符。例如:S1 = Mississippi River,S2 = is。返回将是S1,它将是Mpp Rver。

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

问题是删除all取一个String String param而.remove取一个char char,两者都不起作用。我已经为这一天打过仗,无法得到它,对noobz有什么帮助吗? :)一如既往地谢谢大家。

7 个答案:

答案 0 :(得分:2)

如何更简单:

return S1.replace(S2, "");

请注意,您的示例不起作用:Mississippi River变为Mssippi River

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

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

返回Mpp Rver - 假设s2不包含任何特定于正则表达式的字符。

答案 1 :(得分: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在这里可能已经足够了......但是我想用一些奇怪的案例为自己验证这一点。)

答案 2 :(得分:1)

将此项与Pattern.quote()一起使用以处理正则表达式特殊字符,并将S2视为文字模式。

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

输出:

Mpp Rver

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

这有几个原因:

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

不起作用:(1)您不能将函数调用用作赋值的左侧; (2)即使你可以,但这里没有意义,因为charAt()会返回char而你无法将char分配给String; (3)String是不可变的,所以你不能只改变S1的一个字符。您必须创建一个新字符串并为其指定S1。 [还是(4):j从0变为S2.length(),而不是S1.length(),因此这意味着j应该用作S2的索引,不是S1。]

使用replaceAll作为其他答案建议最简单。如果您不被允许,可以使用 想要的字符构建一个新字符串,而不是删除您不想要的字符(例如,使用StringBuilder;请参阅Jon Skeet的答案)。

或者您可以使用substring从字符串中删除字符,方法是计算字符前后的子字符串并将它们连接起来。要删除i的{​​{1}}个字符(S1处的字符),您可以说

S1.charAt(i)

第一个S1 = S1.substring(0, i) + S1.substring(i + 1); substring的字符,但不包括S1;第二个是从(i)'字符开始直到字符串结尾的字符。

但是,如果没有其他更改,则无法将其置于循环中。原因是您有一个索引遍历i+1的字符,但您刚刚更改了S1,因此许多索引都不同。您可以通过使索引在字符串中向后移动,或者通过确保删除字符时S1不递增来实现此功能。我会让你进一步研究这个细节。

答案 5 :(得分:-1)

试试Regex:

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

答案 6 :(得分:-2)

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