programing

문자열의 특정 인덱스에 있는 문자를 바꾸시겠습니까?

prostudy 2022. 6. 11. 11:44
반응형

문자열의 특정 인덱스에 있는 문자를 바꾸시겠습니까?

문자열의 특정 색인에 있는 문자를 바꾸려고 합니다.

내가 하고 있는 일은:

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

그러면 오류가 발생합니다.이것을 할 수 있는 방법이 있나요?

Java에서는 문자열은 불변입니다.당신은 그들을 바꿀 수 없어요.

문자를 대체한 새 문자열을 생성해야 합니다.

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

또는 String Builder를 사용할 수 있습니다.

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

System.out.println(myName);

String을 char[]로 변환하고 인덱스로 문자를 바꾼 다음 배열을 String으로 다시 변환합니다.

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

String는 Java에서 불변의 클래스입니다.수정하는 것 같은 메서드는 항상 변경된 새 문자열 개체를 반환합니다.

문자열을 조작하는 경우는,StringBuilder또는StringBuffer나사산 안전이 필요한 경우.

Petar Ivanov의 의견에 동의하지만 다음과 같은 방법으로 구현하는 것이 최선입니다.

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을 변경하는 방법은 있지만 안전하지 않고 신뢰할 수 없으며 부정행위로 간주될 수 있기 때문에 권장하지 않습니다.반사를 사용하여 내부를 변경할 수 있습니다.charArray를 지정합니다.리플렉션을 사용하면 현재 범위에 일반적으로 숨겨져 있는 필드 및 메서드(개인 메서드 또는 다른 클래스의 필드...)에 액세스할 수 있습니다.

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등호를 사용하여 값을 할당하는 방법은 없습니다.끈이 불변하면charAtmethod를 사용하여 string 개체를 변경하려면 새 문자를 포함하는 인수를 수신해야 합니다.불행히도 끈은 불변이다.문자열을 수정하기 위해 Petar Ivanov씨의 제안대로 String Builder를 사용해야 했습니다.

이와 같이 동일한 문자열에 덮어쓸 수 있습니다.

String myName = "domanokz";
myName = myName.substring(0, index) + replacement + myName.substring(index+1); 

여기서 index = 대체할 char의 인덱스입니다.index+1: 문자열의 나머지 부분을 추가합니다.

이거면 될 것 같아

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

출력 : domaxokz

언급URL : https://stackoverflow.com/questions/6952363/replace-a-character-at-a-specific-index-in-a-string

반응형