Я пытаюсь заменить символ по определенному индексу в строке.
Что я делаю, это:
String myName = "domanokz";
myName.charAt(4) = 'x';
Это дает ошибку. Есть ли способ сделать это?
double r = Math.sin(3.14)? Как это связано с этим вопросом? Спасибо.
Я пытаюсь заменить символ по определенному индексу в строке.
Что я делаю, это:
String myName = "domanokz";
myName.charAt(4) = 'x';
Это дает ошибку. Есть ли способ сделать это?
double r = Math.sin(3.14)? Как это связано с этим вопросом? Спасибо.
Ответы:
Строка неизменна в Java. Вы не можете их изменить.
Вам нужно создать новую строку с замененным символом.
String myName = "domanokz";
String newName = myName.substring(0,4)+'x'+myName.substring(5);
Или вы можете использовать StringBuilder:
StringBuilder myName = new StringBuilder("domanokz");
myName.setCharAt(4, 'x');
System.out.println(myName);
replaceметод, который не будет изменять строку, а просто вернет новую строку?
Превратите строку в символ [], замените букву на индекс, затем преобразуйте массив обратно в строку.
String myName = "domanokz";
char[] myNameChars = myName.toCharArray();
myNameChars[4] = 'x';
myName = String.valueOf(myNameChars);
myName.substring(0,4)+'x'+myName.substring(5);
Я согласен с Петром Ивановым, но было бы лучше, если бы мы реализовали его следующим образом:
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);
}
Как ранее ответили здесь, Stringслучаи являются неизменными . StringBufferи StringBuilderявляются изменяемыми и пригодными для таких целей, независимо от того, нужно ли вам использовать потокобезопасность или нет.
Однако есть способ изменить String, но я бы никогда не рекомендовал его, потому что это небезопасно, ненадежно и его можно рассматривать как мошенничество: вы можете использовать отражение, чтобы изменить внутренний charмассив, содержащийся в объекте String. Отражение позволяет получить доступ к полям и методам, которые обычно скрыты в текущей области (частные методы или поля из другого класса ...).
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();
}
}
Вы можете перезаписать строку следующим образом:
String myName = "halftime";
myName = myName.substring(0,4)+'x'+myName.substring(5);
Обратите внимание, что строка myNameвстречается на обеих строках и на обеих сторонах второй строки.
Поэтому, хотя строки могут быть технически неизменными, на практике вы можете рассматривать их как редактируемые, перезаписывая их.
Первое, на что я должен был charAtобратить внимание - это метод, и присвоение ему значения с помощью знака равенства ничего не даст. Если строка неизменна, charAtметод, чтобы внести изменения в строковый объект, должен получить аргумент, содержащий новый символ. К сожалению, строка неизменна. Чтобы изменить строку, мне нужно было использовать StringBuilder, как предложил г-н Петар Иванов.
это будет работать
String myName="domanokz";
String p=myName.replace(myName.charAt(4),'x');
System.out.println(p);
Выход: domaxokz
myName.replace(myName.charAt(5),'x')даст вам dxmanxkz, что, вероятно, не то, что требуется.