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?

Author: jww, 2011-08-05

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);
 458
Author: Petar Ivanov,
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);
 114
Author: 16dots,
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

 17
Author: no name,
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);       
}
 11
Author: Leninkumar Koppoju,
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();
    }
}
 5
Author: C.Champagne,
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.

 4
Author: CodeMed,
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.

 0
Author: dpp,
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

 -6
Author: Diabolus Infernalis,
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