簡體   English   中英

從字符串中刪除每次出現的字符

[英]Delete every occurence of a character from a String

我有下面編寫的程序,用於刪除字符串中的每個字符。

public static String removeMultipleCharsFromStr(String str,char temp) {
    StringBuffer sb = new StringBuffer();
    for(int i=0;i<str.length();i++) {
        sb.append(str.charAt(i));
    }       
    for(int i=0;i<sb.length();i++) {
        if(Character.toLowerCase(sb.charAt(i)) == Character.toLowerCase(temp)) {
            sb.deleteCharAt(i);                             
        }
    }       
    System.out.println("Final string: " +sb.toString());
    return sb.toString();
}

當我調用該方法時,它並不會刪除每次出現的字符。 有人可以告訴我我在這里犯什么錯誤嗎?

public class RemoveChar {
public static void main(String[] args) {        
    removeMultipleCharsFromStr("SSSSSaerty", 'S');
}

輸出- Final string: SSaerty

請指教。 另外,我知道我的問題還有其他一百種解決方案。 如果您能讓我知道我的代碼中的錯誤,而不是提出解決方案,我將不勝感激;)

不確定另一個答案發生了什么,但是讓我們看看您的算法中發生了什么。

將所有內容放置在StringBuffer ,它將看起來像這樣:

       i
Index: 0 1 2 3 4 5 6 7 8 9
Value: S S S S S a e r t y

在第一次迭代中(在最后一個循環中),您正在查看索引0( i為0)。 索引0處的字符為S ,因此將其刪除。 現在您的緩沖區如下所示:

         i
Index: 0 1 2 3 4 5 6 7 8
Value: S S S S a e r t y 

第一個S消失了,但是沒有將索引0留空,所有其他字符向左移動了1個位置。 在下一次迭代中, i為1。這意味着您永遠不會查看索引0處的新值。

當您從1轉到2,從2轉到3時,也會發生同樣的事情。最后,這意味着您已跳過2 S值。 如果增加連續S值的數量,則會在輸出中看到更多的值。

           i
Index: 0 1 2 3 4 5 6 7
Value: S S S a e r t y 

             i
Index: 0 1 2 3 4 5 6
Value: S S a e r t y     <-- See?

如果您能讓我知道我的代碼中的錯誤,而不是提出解決方案,我將不勝感激;)

很公平。 祝你好運。 :)

刪除字符時,for循環會前進。 因此,另一個字符將位於您剛剛通過的索引位置。 解決方法是:

public static String removeMultipleCharsFromStr(String str,char temp) {
    StringBuffer sb = new StringBuffer();
    for(int i=0;i<str.length();i++) {
        sb.append(str.charAt(i));
    }       
    for(int i=0;i<sb.length();i++) {
        if(Character.toLowerCase(sb.charAt(i)) == Character.toLowerCase(temp)) {
            sb.deleteCharAt(i);
            i--;      
        }
    }       
    System.out.println("Final string: " +sb.toString());
    return sb.toString();
}

盡管您可以考慮使用注釋中建議的標准替換方法:

str.replaceAll(String.valueOf(temp),"")

只需添加我- i--; sb.deleteCharAt(i); 這樣,您可以從上次中斷的地方繼續。 否則,您將跳過下一個字符,因為StringBuffer的大小減小了1。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM