it-swarm.com.de

Ersetzen Sie ein Zeichen an einem bestimmten Index in einer Zeichenfolge?

Ich versuche, ein Zeichen an einem bestimmten Index in einer Zeichenfolge zu ersetzen.

Was ich mache ist:

String myName = "domanokz";
myName.charAt(4) = 'x';

Dies gibt einen Fehler. Gibt es eine Methode, um dies zu tun?

346
dpp

Zeichenketten sind in Java unveränderlich. Sie können sie nicht ändern.

Sie müssen eine neue Zeichenfolge erstellen, wobei das Zeichen ersetzt wird.

String myName = "domanokz";
String newName = myName.substring(0,4)+'x'+myName.substring(5);

Oder Sie können einen StringBuilder verwenden:

StringBuilder myName = new StringBuilder("domanokz");
myName.setCharAt(4, 'x');

System.out.println(myName);
523
Petar Ivanov

Verwandle den String in ein Zeichen [], ersetze den Buchstaben durch einen Index und wandle das Array wieder in einen String um.

String myName = "domanokz";
char[] myNameChars = myName.toCharArray();
myNameChars[4] = 'x';
myName = String.valueOf(myNameChars);
141
16dots

String ist eine unveränderliche Klasse in Java. Alle Methoden, die zu modifizieren scheinen, geben immer ein neues String-Objekt mit Modifikation zurück. Wenn Sie eine Zeichenfolge manipulieren möchten, ziehen Sie StringBuilder oder StringBuffer in Betracht, falls Sie Thread-Sicherheit benötigen

17
no name

Ich stimme Petar Ivanov zu, aber es ist am besten, wenn wir Folgendes umsetzen:

public String replace(String str, int index, char replace){     
    if(str==null){
        return str;
    }else if(index<0 || index>=str.length()){
        return str;
    }
    char[] chars = str.toCharArray();
    chars[index] = replace;
    return String.valueOf(chars);       
}
11

Wie zuvor hier beantwortet, sind String Instanzen unveränderlich . StringBuffer und StringBuilder sind wandelbar und für einen solchen Zweck geeignet, unabhängig davon, ob Sie threadsicher sein müssen oder nicht.

Es gibt jedoch eine Möglichkeit, eine Zeichenfolge zu ändern, ich würde sie jedoch niemals empfehlen, da sie unsicher und unzuverlässig ist und als Betrug angesehen werden kann. Sie können Reflektion verwenden, um die innere char zu ändern. Array, das das String-Objekt enthält. Reflection ermöglicht den Zugriff auf Felder und Methoden, die normalerweise im aktuellen Bereich verborgen sind (private Methoden oder Felder einer anderen Klasse ...).

public static void main(String[] args) {
    String text = "This is a test";
    try {
        //String.value is the array of char (char[])
        //that contains the text of the String
        Field valueField = String.class.getDeclaredField("value");
        //String.value is a private variable so it must be set as accessible 
        //to read and/or to modify its value
        valueField.setAccessible(true);
        //now we get the array the String instance is actually using
        char[] value = (char[])valueField.get(text);
        //The 13rd character is the "s" of the Word "Test"
        value[12]='x';
        //We display the string which should be "This is a text"
        System.out.println(text);
    } catch (NoSuchFieldException | SecurityException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}
6
C.Champagne

Sie können eine Zeichenfolge wie folgt überschreiben:

String myName = "halftime";
myName = myName.substring(0,4)+'x'+myName.substring(5);  

Beachten Sie, dass die Zeichenfolge myName in beiden Zeilen und auf beiden Seiten der zweiten Zeile vorkommt.

Daher können Sie Zeichenfolgen, auch wenn sie technisch gesehen unveränderlich sind, in der Praxis als bearbeitbar behandeln, indem Sie sie überschreiben.

4
CodeMed

Als erstes hätte ich bemerken müssen, dass charAt eine Methode ist und das Zuweisen von Werten mit Gleichheitszeichen nichts bewirkt. Wenn eine Zeichenfolge unveränderlich ist, muss die Methode charAt zum Ändern des Zeichenfolgenobjekts ein Argument erhalten, das das neue Zeichen enthält. Leider ist die Saite unveränderlich. Um die Zeichenfolge zu ändern, musste ich StringBuilder verwenden, wie von Herrn Petar Ivanov vorgeschlagen.

0
dpp