web-dev-qa-db-fra.com

Remplacer un caractère à un index spécifique dans une chaîne?

J'essaie de remplacer un caractère à un index spécifique dans une chaîne.

Ce que je fais c'est:

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

Cela donne une erreur. Y a-t-il une méthode pour faire cela?

346
dpp

Les chaînes sont immuables en Java. Vous ne pouvez pas les changer.

Vous devez créer une nouvelle chaîne avec le caractère remplacé.

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

Ou vous pouvez utiliser un StringBuilder:

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

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

Transformez la chaîne en caractères [], remplacez la lettre par index, puis reconvertissez le tableau en chaîne.

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

String est une classe immuable dans Java toutes les méthodes qui semblent la modifier renvoient toujours un nouvel objet chaîne avec modification. si vous voulez manipuler une chaîne, considérez StringBuilder ou StringBuffer au cas où vous auriez besoin de la sécurité des threads.

17
no name

Je suis d’accord avec Petar Ivanov, mais c’est mieux si nous appliquons les règles suivantes:

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

Comme précédemment répondu ici, String instances sont immuables . StringBuffer et StringBuilder sont mutables et adaptés à un tel objectif, que vous ayez besoin d'être thread-safe ou non.

Il y a cependant un moyen de modifier une chaîne mais je ne le recommanderais jamais car c'est dangereux, peu fiable et cela peut être considéré comme de la triche: vous pouvez utiliser réflexion pour modifier le caractère interne char tableau que l'objet String contient. Reflection vous permet d'accéder aux champs et aux méthodes qui sont normalement cachés dans l'étendue actuelle (méthodes privées ou champs d'une autre classe ...).

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

Vous pouvez écraser une chaîne, comme suit:

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

Notez que la chaîne myName apparaît sur les deux lignes et sur les deux côtés de la deuxième ligne.

Par conséquent, même si les chaînes sont techniquement immuables, vous pouvez les traiter comme modifiables en les écrasant.

4
CodeMed

La première chose que j'aurais dû remarquer est que charAt est une méthode et que lui attribuer une valeur en utilisant le signe égal ne fera rien. Si une chaîne est immuable, la méthode charAt, pour modifier l'objet chaîne, doit recevoir un argument contenant le nouveau caractère. Malheureusement, la ficelle est immuable. Pour modifier la chaîne, je devais utiliser StringBuilder comme suggéré par M. Petar Ivanov.

0
dpp