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%
String
is 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 StringBuilder
of StringBuffer
voor 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 myName
op 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. StringBuffer
en StringBuilder
zijn 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 char
array 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 charAt
een 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