Я намагаюся замінити символ на певний індекс в рядку.
Що я роблю, це:
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
метод, який не змінює рядок, а просто поверне нову рядок?
Перетворіть рядок у char [], замініть букву на індекс, а потім перетворіть масив назад у String.
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
, що, мабуть, не є тим, що потрібно.