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