簡體   English   中英

如何在不使用.replace的情況下替換Java中字符串中的字符?

[英]How to replace characters in a string in Java without using .replace?

此程序的目標是提示用戶輸入單個字符和短語,然后用'$'替換該短語中該字符的任何實例。 我的程序就是這樣做的,但是當我向我的教授展示時,我被告知我不能在我構建的方法中使用.replace,所以我必須找到一種不使用它的方法。 我已經工作了一段時間,到目前為止我知道我可以用for循環替換它,但經過幾次令人沮喪的迭代之后,我似乎無法做到正確。 對不起,如果我的代碼看起來很時髦,我仍然是一名入門的java學生,所以我還在學習基礎知識。 我在下面的代碼片段末尾提供了一個建議的解決方案。

public static char getKeyCharacter(String userInput) {

    char keyCharacter;
    Scanner inputStream = new Scanner(System.in);
    while(userInput.length() > 1) 
    {
        System.out.println("Please enter a SINGLE character to use as key: ");
        userInput = inputStream.nextLine();
    }
    keyCharacter = userInput.charAt(0);

    return keyCharacter;
}
public static String getString(String userResponse) {

    Scanner inputStream = new Scanner(System.in);
    String theString;
    while(userResponse.length() > 500) {
        System.out.println("Please enter a phrase or sentence >= 4 and <=500 characters: ");
        userResponse = inputStream.nextLine();
    }
    while(userResponse.length() < 4) {
        System.out.println("Please enter a phrase or sentence >= 4 and <=500 characters: ");
        userResponse = inputStream.nextLine();

    }

    theString = userResponse;
    return theString;

}
public static String maskCharacter(String theString, char keyCharacter){

    String maskedString = "";
    final char mask = '$';
    maskedString = maskedString + theString.replace(keyCharacter, mask);
    System.out.println("String with " + keyCharacter + " masked: ");
    return maskedString;
}

public static String removeCharacter(String theString, char keyCharacter) {

    String modifiedString = " ";
    final char replaceChar = ' ';
    modifiedString = modifiedString + theString.replace(keyCharacter, replaceChar);
    System.out.println("String with " + keyCharacter + " removed:");
    return modifiedString;

}

public static int countKey(String theString, char keyCharacter) {
    int charCount = 0;
    for (int c = 0; c < theString.length(); c++) {
        if (theString.charAt(c) == keyCharacter) {
            charCount++;
        }
    }
    System.out.println("Occurences of " + keyCharacter + " in string:");
    return charCount;
}  

}

我相信解決方案看起來會像這樣,但到目前為止我一直不成功 -

public static String maskCharacter(String theString, char keyCharacter){

    String maskedString = "";
    final char mask = '$';
    for (int k = 0; k < theString.length(); k++) {
        if (theString.charAt(k) == keyCharacter) {
            keyCharacter = mask;
         }
    System.out.println("String with " + keyCharacter + " masked: ");
    return maskedString;
}

我的問題在於使用mask替換所有keyCharacters,使maskedString = theString。 為了記錄,我還沒有學習任何關於那些花哨的數組,所以如果有一種方法可以使用一個簡單的for循環來做到這一點我會非常感激。 感謝您的幫助!

我會使用StringBuilderString#toCharArray()以及一個簡單的for-each循環。 喜歡,

public static String maskCharacter(String theString, char keyCharacter){
    StringBuilder sb = new StringBuilder();
    for (char ch : theString.toCharArray()) {
        if (ch == keyCharacter) {
            sb.append('$'); // <-- mask keyCharacter(s).
        } else {
            sb.append(ch); // <-- it isn't the character to mask
        }
    }
    return sb.toString();
}

我不會使用StringBuilder :直接使用toCharArray()的結果:

char[] cs = theString.toCharArray();
for (int i = 0; i < cs.length; ++i) {
  if (cs[i] == keyCharacter) cs[i] = '$';
}
return new String(cs);

它不僅更簡潔,而且:

  • 它運行得更快,因為訪問數組元素比調用方法更便宜; 並且因為它不需要StringBuilder的內部緩沖區來調整大小(盡管你可以預先調整大小);
  • 它將使用更少的內存,因為它不需要存儲StringBuilder中的副本。

public static String maskCharacter(String theString,char keyCharacter){

String masked = "";
for (int i = 0 ; i < theString.length() ; i++) {

    if (theString.charAt(i) == keyCharacter) {
         masked += "$";
    } 
    else {
        masked+=theString.charAt(i)+"";
    }
}
return masked;

}

僅使用字符串連接和基本字符訪問的答案。

您似乎知道可以將某些內容連接到字符串並獲取不同的字符串。

maskedString = maskedString + ...;

您還知道可以構建一個使用.charAt()獲取每個單獨字符的for循環

for (int k = 0; k < theString.length(); k++) {
    char nch = theString.charAt(k);
}

您可以檢查字符之間的相等性

if (nch == keyCharacter)

...假設你知道其他分支,是不是很清楚你只需要將它們放在一起?

if (nch == keyCharacter) {
    // append '$' to maskedString
}
else {
    // append nch to maskedString
}

當然,這會在每次循環迭代時創建一個新字符串,因此效率不高。 但我認為這不是演習的重點。

暫無
暫無

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

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