Een teken vervangen bij een specifieke index in een tekenreeks?

Ik probeer een teken bij een specifieke index in een tekenreeks te vervangen.

Wat ik doe is:

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

Dit geeft een foutmelding. Is er een methode om dit te doen?


Antwoord 1, autoriteit 100%

String is onveranderlijk in Java. Je kunt ze niet wijzigen.

Je moet een nieuwe tekenreeks maken waarbij het teken wordt vervangen.

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

Of je kunt een StringBuilder gebruiken:

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

Antwoord 2, autoriteit 30%

Verander de string in een char[], vervang de letter door index en converteer de array vervolgens terug naar een string.

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

Antwoord 3, autoriteit 3%

Stringis een onveranderlijke klasse in java. Elke methode die deze lijkt te wijzigen, retourneert altijd een nieuw tekenreeksobject met wijziging.

Als je een string wilt manipuleren, overweeg dan StringBuilderof StringBuffervoor het geval je threadbeveiliging nodig hebt.


Antwoord 4, autoriteit 2%

Ik ben het eens met Petar Ivanov, maar het is het beste als we het op de volgende manier implementeren:

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);       
}

Antwoord 5

U kunt een tekenreeks als volgt overschrijven:

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

Merk op dat de string myNameop beide regels voorkomt, en aan beide zijden van de tweede regel.

Dus hoewel strings technisch gezien onveranderlijk kunnen zijn, kun je ze in de praktijk als bewerkbaar behandelen door ze te overschrijven.


Antwoord 6

Zoals eerder hier beantwoord, zijn String-instanties onveranderlijk. StringBufferen StringBuilderzijn veranderlijk en geschikt voor een dergelijk doel, of je nu thread-safe moet zijn of niet.

Er is echter een manier om een ​​string aan te passen, maar ik zou het nooit aanraden omdat het onveilig en onbetrouwbaar is en het kan worden beschouwd als valsspelen: je kunt reflectionom de binnenste chararray te wijzigen die het String-object bevat. Reflectiegeeft u toegang tot velden en methoden die normaal gesproken verborgen zijn in de huidige scope (private methoden of velden uit een andere 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();
    }
}

Antwoord 7

Het eerste dat me had moeten opvallen, is dat charAteen methode is en dat het niets uithalen om er waarde aan toe te kennen met een gelijkteken. Als een tekenreeks onveranderlijk is, moet de charAt-methode, om een ​​wijziging in het tekenreeksobject aan te brengen, een argument ontvangen dat het nieuwe teken bevat. Helaas is string onveranderlijk. Om de string te wijzigen, moest ik StringBuilder gebruiken, zoals voorgesteld door de heer Petar Ivanov.


Antwoord 8

dit zal werken

  String myName="domanokz";
   String p=myName.replace(myName.charAt(4),'x');
   System.out.println(p);

Uitvoer: domaxokz

Other episodes