Java刪除String中指定字符的11種方法匯總
方法一
第一種方法 – 通過(guò)循環(huán)從前往后遍歷,如果不是要?jiǎng)h除的字符則加到處理后的字符串中,代碼如下:
public String deleteCharString0(String sourceString, char chElemData) {
String resultString = "";
for (int i = 0; i < sourceString.length(); i++) {
if (sourceString.charAt(i) != chElemData) {
resultString += sourceString.charAt(i);
}
}
return resultString;
}
金手指小結(jié):sourceString.charAt(i) 遍歷查找,resultString做 += 拼接操作,一共拼接sourceString.length-1次,sourceString.charAt()來(lái)拼接。
優(yōu)點(diǎn):只是使用 string.charAt() 遍歷;
缺點(diǎn):對(duì)string做 += 拼接操作,因?yàn)閟tring是final修飾的不可變對(duì)象,所以要做n次字符串拼接,效率很低。
方法二
第二種方法 — 通過(guò)循環(huán)確定要?jiǎng)h除字符的位置索引,然后通過(guò)分割字符串的形式,將子字符串拼接,注意最后一段子字符串和源字符串中沒(méi)有要?jiǎng)h除字符的情況,代碼如下:
public String deleteCharString1(String sourceString, char chElemData) {
String resultString = "";
int iIndex = 0;
for (int i = 0; i < sourceString.length(); i++) {
if (sourceString.charAt(i) == chElemData) {
if (i > 0) {
resultString += sourceString.substring(iIndex, i); // string類(lèi)型 += ,這是字符串拼接操作
}
iIndex = i + 1;
}
}
if (iIndex <= sourceString.length()) {
resultString += sourceString.substring(iIndex, sourceString.length());
}
return resultString;
}
金手指小結(jié):sourceString.charAt(i) 遍歷查找,resultString做 += 拼接操作,拼接次數(shù)較方法1少,sourceString.substring來(lái)拼接。
方法三
第三種方法 — 原理同上,只不過(guò)查找要?jiǎng)h除字符位置采用String類(lèi)中的函數(shù)執(zhí)行,效率不如上面的高,代碼如下:
public String deleteCharString2(String sourceString, char chElemData) {
String resultString = "";
int iIndex = 0;
int tmpCount = 0;
do {
tmpCount = sourceString.indexOf(chElemData, iIndex); // indexof定位到要?jiǎng)h除的元素,
// 然后使用substring拼接,因?yàn)橐獎(jiǎng)h除的元素chElement可能在sourceString字符串中存在多個(gè),所以要使用dowhile循環(huán)
if (tmpCount > 0) {
resultString += sourceString.substring(iIndex, tmpCount);
}
if (tmpCount != -1) {
iIndex = tmpCount + 1;
}
} while (tmpCount != -1);
if (iIndex <= sourceString.length()) {
resultString += sourceString.substring(iIndex, sourceString.length());
}
return resultString;
}
金手指小結(jié):indexof定位到要?jiǎng)h除的元素,然后使用substring拼接,因?yàn)橐獎(jiǎng)h除的元素chElement可能在sourceString字符串中存在多個(gè),所以要使用do…while循環(huán)。
方法四
第四種方法 — 原理與上方基本一致,只不過(guò)這次采用倒序方式,這里的坑就更多了,一定要注意索引的取值范圍和是否合法,代碼如下:
public String deleteCharString3(String sourceString, char chElemData) {
String deleteString = "";
int iIndex = sourceString.length();
int tmpCount = 0;
do {
tmpCount = sourceString.lastIndexOf(chElemData, iIndex - 1);
if (tmpCount < sourceString.length() && tmpCount >= 0) {
deleteString = sourceString.substring(tmpCount + 1, iIndex) + deleteString;
}
if (tmpCount != -1) {
iIndex = tmpCount;
}
} while (tmpCount != -1);
if (iIndex >= 0) {
deleteString = sourceString.substring(0, iIndex) + deleteString;
}
return deleteString;
}
金手指小結(jié):lastIndexOf定位到要?jiǎng)h除的元素,然后使用substring拼接,因?yàn)橐獎(jiǎng)h除的元素chElement可能在sourceString字符串中存在多個(gè),所以要使用dowhile循環(huán)。
方法五
第五種方法 — 通過(guò)采用正則的方式和replaceAll函數(shù),本種方法要注意特殊字符,例如正則中的 “.”字符,需要對(duì)特殊字符進(jìn)行轉(zhuǎn)義,代碼如下:
public String deleteCharString4(String sourceString, char chElemData) {
String deleteString = "";
final String strTable = "|^$*+?.(){}\\";
String tmpRegex = "[";
for (int i = 0; i < strTable.length(); i++) {
if (strTable.charAt(i) == chElemData) {
tmpRegex += "\\";
break;
}
}
tmpRegex += chElemData + "]";
deleteString = sourceString.replaceAll(tmpRegex, "");
return deleteString;
}
方法六
第六種方法 — 采用正則的方式將字符串分割成幾個(gè)子字符串,再將子字符串進(jìn)行拼接,代碼如下:
public String deleteCharString5(String sourceString, char chElemData) {
String deleteString = "";
final String strTable = "|^$*+?.(){}\\";
String tmpRegex = "[";
for (int i = 0; i < strTable.length(); i++) {
if (strTable.charAt(i) == chElemData) {
tmpRegex += "\\";
break;
}
}
tmpRegex += chElemData + "]";
String[] tmpStringArray = sourceString.split(tmpRegex);
for (int i = 0; i < tmpStringArray.length; i++) {
deleteString += tmpStringArray[i];
}
return deleteString;
}
金手指小結(jié):
第一,返回結(jié)果還是String,所以還是要拼接得到結(jié)果;
第二,遍歷查找過(guò)程,因?yàn)閟ourceString變成char數(shù)組,使用==比較,循環(huán)sourceString.length次。
方法七
第七種方法 — 將字符編程可讀序列,在通過(guò) String 類(lèi)中的方法替換,代碼如下:
public String deleteCharString6(String sourceString, char chElemData) {
String tmpString = "";
tmpString += chElemData;
tmpString.subSequence(0, 0);
String deleteString = "";
deleteString = sourceString.replace(tmpString, deleteString.subSequence(0, 0));
return deleteString;
}
方法八
第八種方法 — 把原字符串轉(zhuǎn)化為字符數(shù)組,然后原理與直接插入排序原理類(lèi)似,代碼如下:
public String deleteCharString7(String sourceString, char chElemData) {
String deleteString = "";
char[] Bytes = sourceString.toCharArray(); // sourceString變?yōu)閏har[]數(shù)組
int iSize = Bytes.length; // 記錄大小size
for (int i = Bytes.length - 1; i >= 0; i--) {
if (Bytes[i] == chElemData) {
for (int j = i; j < iSize - 1; j++) {
Bytes[j] = Bytes[j + 1];
}
iSize--;
}
}
for (int i = 0; i < iSize; i++) {
deleteString += Bytes[i]; // 還是拼接
}
return deleteString;
}
金手指小結(jié):
第一,返回結(jié)果還是String,所以還是要拼接得到結(jié)果;
第二,遍歷查找過(guò)程,因?yàn)閟ourceString變成char數(shù)組,使用==比較,循環(huán)sourceString.length次。
方法九
第九種方法 — 原理與 第一種方法 類(lèi)似,本次采用 stringBuffer 類(lèi)中的 append 方法進(jìn)行操作,但是效率應(yīng)該高于第一種。
public String deleteCharString8(String sourceString, char chElemData) {
StringBuffer stringBuffer = new StringBuffer("");
for (int i = 0; i < sourceString.length(); i++) {
if (sourceString.charAt(i) != chElemData) {
stringBuffer.append(sourceString.charAt(i));
}
}
return stringBuffer.toString();
}
金手指小結(jié):
第一,初始字符串就是返回結(jié)果,之前都是return string對(duì)象,所以需要字符串拼接,現(xiàn)在return stringbuffer,最后stringbuffer.toString;
第二,遍歷查找過(guò)程,因?yàn)閟ourceString是String,只能使用charAt(i),循環(huán)sourceString.length次;
第三,得到返回結(jié)果的操作,找到要?jiǎng)h除的,使用stringbuffer代替string操作,使用stringbuffer的append(),保證刪除操作不會(huì)因?yàn)樽址唇佣讓由尚伦址?/p>
優(yōu)點(diǎn):在第一步,返回結(jié)果變成了stringbuffer,因?yàn)榈谝徊?,所以第三步stringbuffer.append代替了字符串拼接;
缺陷:第二點(diǎn),因?yàn)閟ourceString是String,只能使用charAt(i),仍然循環(huán)sourceString.length次。
方法十
第十種方法 — 采用 stringBuffer 類(lèi)中的 replace and indexOf 方法(_ 故意湊方法),代碼如下:
public String deleteCharString9(String sourceString, char chElemData) {
String tmpString = "";
tmpString += chElemData;
StringBuffer stringBuffer = new StringBuffer(sourceString);
int iFlag = -1;
do {
iFlag = stringBuffer.indexOf(tmpString);
if (iFlag != -1) {
stringBuffer = stringBuffer.replace(iFlag, iFlag + 1, "");
}
} while (iFlag != -1);
return stringBuffer.toString();
}
金手指小結(jié):
第一,初始字符串就是返回結(jié)果,之前都是return string對(duì)象,所以需要字符串拼接,現(xiàn)在return stringbuffer,最后stringbuffer.toString;
第二,遍歷查找過(guò)程,先用sourceString初始化stringbuffer,stringbuffer保證線程安全,使用indexof代替無(wú)腦charAt(),減少循環(huán)次數(shù);
第三,得到返回結(jié)果的操作,找到要?jiǎng)h除的,使用stringbuffer代替string操作,使用stringbuffer的replace()將指定位置char變?yōu)榭兆址?,保證刪除操作不會(huì)因?yàn)樽址唇佣讓由尚伦址?/p>
方法十一
第十一種方法 — 采用 stringBuffer 類(lèi)中的 deleteCharAt 和 indexOf 直接刪除
public String deleteCharString10(String sourceString, char chElemData) {
String tmpString = "";
tmpString += chElemData;
StringBuffer stringBuffer = new StringBuffer(sourceString);
int iFlag = -1;
do {
iFlag = stringBuffer.indexOf(tmpString);
if (iFlag != -1) {
stringBuffer.deleteCharAt(iFlag);
}
} while (iFlag != -1);
return stringBuffer.toString();
}
金手指小結(jié):
第一,之前都是return string對(duì)象,所以需要字符串拼接,現(xiàn)在return stringbuffer,最后stringbuffer.toString;
第二,先用sourceString初始化stringbuffer,stringbuffer保證線程安全,使用indexof代替無(wú)腦charAt(),減少循環(huán)次數(shù);
第三,找到要?jiǎng)h除的,使用stringbuffer代替string操作,使用stringbuffer的deleteCharAt()保證刪除操作不會(huì)因?yàn)樽址唇佣讓由尚伦址?/p>
尾聲
效率最高的是方法十和方法十一, 都滿足參數(shù)為sourceString和deleteChar,返回值為resultString?;仡櫼幌拢?/p>
方法十:
第一,初始字符串就是返回結(jié)果,之前都是return string對(duì)象,所以需要字符串拼接,現(xiàn)在return stringbuffer,最后stringbuffer.toString;
第二,遍歷查找過(guò)程,先用sourceString初始化stringbuffer,stringbuffer保證線程安全,使用indexof代替無(wú)腦charAt(),減少循環(huán)次數(shù);
第三,得到返回結(jié)果的操作,找到要?jiǎng)h除的,使用stringbuffer代替string操作,使用stringbuffer的replace()將指定位置char變?yōu)榭兆址?,保證刪除操作不會(huì)因?yàn)樽址唇佣讓由尚伦址?/p>
方法十一:
第一,之前都是return string對(duì)象,所以需要字符串拼接,現(xiàn)在return stringbuffer,最后stringbuffer.toString;
第二,先用sourceString初始化stringbuffer,stringbuffer保證線程安全,使用indexof代替無(wú)腦charAt(),減少循環(huán)次數(shù);
第三,找到要?jiǎng)h除的,使用stringbuffer代替string操作,使用stringbuffer的deleteCharAt()保證刪除操作不會(huì)因?yàn)樽址唇佣讓由尚伦址?/p>
到此這篇關(guān)于Java刪除String中指定字符的11種方法匯總的文章就介紹到這了,更多相關(guān)Java刪除String指定字符內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springSecurity自定義登錄接口和JWT認(rèn)證過(guò)濾器的流程
這篇文章主要介紹了springSecurity自定義登陸接口和JWT認(rèn)證過(guò)濾器的相關(guān)資料,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-12-12
解決Spring在Thread中注入Bean無(wú)效的問(wèn)題
這篇文章主要介紹了解決Spring在Thread中注入Bean無(wú)效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
詳解java創(chuàng)建一個(gè)女朋友類(lèi)(對(duì)象啥的new一個(gè)就是)==建造者模式,一鍵重寫(xiě)
這篇文章主要介紹了java建造者模式一鍵重寫(xiě),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
SpringBoot請(qǐng)求處理之常用參數(shù)注解介紹與源碼分析
SpringBoot是一種整合Spring技術(shù)棧的方式(或者說(shuō)是框架),同時(shí)也是簡(jiǎn)化Spring的一種快速開(kāi)發(fā)的腳手架,本篇讓我們一起學(xué)習(xí)請(qǐng)求處理、常用注解和方法參數(shù)的小技巧2022-10-10
java中HashMap.values()轉(zhuǎn)為ArrayList()問(wèn)題
這篇文章主要介紹了java中HashMap.values()轉(zhuǎn)為ArrayList()問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03

