¿Reemplazar un personaje en un índice específico en una cadena?

Estoy tratando de reemplazar un personaje en un índice específico en una cadena.

Lo que estoy haciendo es:

String myName = "domanokz"; myName.charAt(4) = 'x'; 

Esto da un error. ¿Hay algún método para hacer esto?

La cadena es inmutable en Java. No puedes cambiarlos.

Necesitas crear una nueva cadena con el personaje reemplazado.

 String myName = "domanokz"; String newName = myName.substring(0,4)+'x'+myName.substring(5); 

O puede usar un StringBuilder:

 StringBuilder myName = new StringBuilder("domanokz"); myName.setCharAt(4, 'x'); System.out.println(myName); 

Convierta la Cadena en un char [], reemplace la letra por índice y luego convierta la matriz nuevamente en una Cadena.

 String myName = "domanokz"; char[] myNameChars = myName.toCharArray(); myNameChars[4] = 'x'; myName = String.valueOf(myNameChars); 

String es una clase inmutable en java. Cualquier método que parezca modificarlo siempre devuelve un nuevo objeto de cadena con modificación. si desea manipular una cadena, considere StringBuilder o StringBuffer en caso de que necesite seguridad de subprocesos

Estoy de acuerdo con Petar Ivanov pero es mejor si implementamos de la siguiente manera:

 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); } 

Como se respondió anteriormente aquí, las instancias de String son inmutables . StringBuffer y StringBuilder son mutables y adecuados para tal fin, ya sea que necesites ser seguro o no.

Sin embargo, hay una forma de modificar una Cadena, pero nunca la recomendaría porque es insegura, poco confiable y puede considerarse como trampa: puede usar la reflexión para modificar la matriz de caracteres interna que contiene el objeto Cadena. Reflection le permite acceder a campos y métodos que normalmente están ocultos en el ámbito actual (métodos privados o campos de otra clase …).

 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(); } } 

Puede sobreescribir una cadena, de la siguiente manera:

 String myName = "halftime"; myName = myName.substring(0,4)+'x'+myName.substring(5); 

Tenga en cuenta que la cadena myName aparece en ambas líneas y en ambos lados de la segunda línea.

Por lo tanto, aunque las cadenas pueden ser técnicamente inmutables, en la práctica, puede tratarlas como editables sobrescribiéndolas.

Lo primero que debería haber notado es que charAt es un método y asignarle valor usando el signo igual no hará nada. Si una cadena es inmutable, el método charAt , para hacer cambios en el objeto cadena, debe recibir un argumento que contenga el nuevo carácter. Desafortunadamente, la cuerda es inmutable. Para modificar la cadena, necesitaba usar StringBuilder como lo sugirió el Sr. Petar Ivanov.

esto funcionará

  String myName="domanokz"; String p=myName.replace(myName.charAt(4),'x'); System.out.println(p); 

Salida: domaxokz

    Intereting Posts