문자열의 특정 색인에있는 문자를 바꾸시겠습니까? 문자열의 특정 색인에서 문자를 바꾸려고합니다. 내가하고있는 일은

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

내가하고있는 일은 :

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

오류가 발생합니다. 이를 수행 할 방법이 있습니까?



답변

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


답변

문자열을 char []로 바꾸고 문자를 색인으로 바꾸고 배열을 다시 문자열로 변환하십시오.

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


답변

Stringjava의 불변 클래스입니다. 수정 된 것처럼 보이는 모든 메소드는 항상 수정 된 새 문자열 객체를 반환합니다.

당신이 문자열을 조작하려면, 고려 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당신이 스레드 안전 여부 될 필요가 있는지 가변 그러한 목적에 적합합니다.

그러나 문자열을 수정하는 방법이 있지만 안전하지 않고 신뢰할 수 없으며 부정 행위로 간주 될 수 있기 때문에 권장하지 않습니다. 반사 를 사용 char하여 문자열 객체에 포함 된 내부 배열 을 수정할 수 있습니다. 리플렉션을 사용하면 현재 범위에서 일반적으로 숨겨져있는 필드 및 메서드 (다른 클래스의 개인 메서드 또는 필드 …)에 액세스 할 수 있습니다.

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문자열 개체를 변경하려면 메서드에서 새 문자가 포함 된 인수를 받아야합니다. 불행히도 문자열은 변경할 수 없습니다. 문자열을 수정하려면 Petar Ivanov가 제안한 StringBuilder를 사용해야했습니다.