Zastąpić znak w określonym indeksie w łańcuchu?
Próbuję zastąpić znak w określonym indeksie w łańcuchu znaków.
To co robię to:
String myName = "domanokz";
myName.charAt(4) = 'x';
To daje błąd. Czy jest na to jakaś metoda?
8 answers
String są niezmienne w Javie. Nie możesz ich zmienić.
Musisz utworzyć nowy ciąg znaków z podmienionym znakiem.
String myName = "domanokz";
String newName = myName.substring(0,4)+'x'+myName.substring(5);
Lub możesz użyć Stringbuildera:
StringBuilder myName = new StringBuilder("domanokz");
myName.setCharAt(4, 'x');
System.out.println(myName);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-21 02:25:11
Zamienia Łańcuch znaków na znak [], zastępuje literę indeksem, a następnie konwertuje tablicę z powrotem na łańcuch znaków.
String myName = "domanokz";
char[] myNameChars = myName.toCharArray();
myNameChars[4] = 'x';
myName = String.valueOf(myNameChars);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-10 21:11:14
String jest niezmienną klasą w Javie wszelkie metody, które wydają się ją modyfikować, zawsze zwracają nowy obiekt string z modyfikacją. jeśli chcesz manipulować ciągiem, rozważ StringBuilder lub StringBuffer w przypadku, gdy potrzebujesz bezpieczeństwa wątku
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-05 07:00:12
Zgadzam się z Petarem Ivanovem, ale najlepiej będzie, jeśli zaimplementujemy w następujący sposób:
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);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-03 07:38:22
Jak już wcześniej odpowiedzieliśmy, String
instancje są niezmienne . StringBuffer
i StringBuilder
są mutowalne i odpowiednie do tego celu, niezależnie od tego, czy musisz być bezpieczny dla wątku, Czy nie.
Istnieje jednak sposób, aby zmodyfikować Łańcuch znaków, ale nigdy nie polecam go, ponieważ jest niebezpieczny, zawodny i może być uznany za oszustwo : możesz użyć reflection aby zmodyfikować wewnętrzną tablicę char
, którą zawiera obiekt String. Reflection umożliwia dostęp do pól i metod które są zwykle ukryte w bieżącym zakresie (prywatne metody lub pola z innej klasy...).
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();
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-20 16:44:47
Możesz nadpisać ciąg znaków w następujący sposób:
String myName = "halftime";
myName = myName.substring(0,4)+'x'+myName.substring(5);
Zauważ, że łańcuch myName
występuje w obu liniach i po obu stronach drugiej linii.
Dlatego, nawet jeśli łańcuchy mogą być niezmienne technicznie, w praktyce można je traktować jako edytowalne przez nadpisanie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-30 19:00:07
Pierwszą rzeczą, którą powinienem był zauważyć jest to, że charAt
jest metodą i przypisanie jej wartości za pomocą znaku równości nic nie da. Jeżeli łańcuch znaków jest niezmienny, metoda charAt
, aby dokonać zmiany w obiekcie string musi otrzymać argument zawierający nowy znak. Niestety, ciąg jest niezmienny. Aby zmodyfikować ciąg, musiałem użyć Stringbuildera zgodnie z sugestią Pana Petara Ivanova.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-20 07:58:11
To zadziała
String myName="domanokz";
String p=myName.replace(myName.charAt(4),'x');
System.out.println(p);
Wyjście : domaxokz
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-03 06:38:56