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


382

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

내가하고있는 일은 :

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

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


12
나는 이것이 죽음에 대한 답변임을 알고 있지만 Java에서 함수 호출의 결과를 할당하는 것은 결코 허용 되지 않는다는 점에 주목할 가치가 있습니다. C (?) 및 C ++의 참조와 같은 것은 없습니다.
ApproachingDarknessFish

1
VB의 @ValekHalfHeart, 괄호를 사용하여 배열의 인덱스에 액세스하면 Java에서 시작할 때 혼란 스러울 수 있습니다 .D
dpp

@ ApproachingDarknessFish "java에서 함수 호출의 결과를 할당 할 수 없습니다"라는 것이 무슨 의미인지 잘 모르겠습니다. 확실하게 할 수 double r = Math.sin(3.14)있습니까? 이 질문과 어떤 관련이 있습니까? 감사.
flow2k

1
@ flow2k Oh jeez, 오래된 주석이므로 편집 할 수 없지만 오타 입니다. "Java에서 함수 호출 결과에 할당 수는 없습니다"라고 말해야합니다 . 즉, "foo = bar ();"라고 쓸 수 있습니다 그러나 결코 "bar () = foo;".
ApproachingDarknessFish

설명 @ApproachingDarknessFish에 감사드립니다. 함수의 결과에 무언가를 할당하는 것이 이상하다고 생각합니다. 실제로 이것을 허용하는 언어가 있습니까? 유스 케이스가 무엇인지 궁금합니다.
flow2k

답변:


566

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

3
아, replace문자열을 수정하지 않고 새로운 문자열을 반환하는 방법 과 같은 의미 입니까?
dpp

1
약간 복잡한 Mr.Petar입니다. 그게 가장 좋은 방법인가요? 아, StringBuilder에 대해 들어 본 적이 있는데, 그 차이가 있습니까? 더 쉬운 방법을 제공합니까?
dpp

158

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

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

1
이 솔루션을 좋아하십시오. 세 번째 줄을 myNameChars [index] = character.toCharArray () [0]; 단순화를 위해. 좋은 해결책.
Dale

2
그것은 다른 myName.substring(0,4)+'x'+myName.substring(5);
못생긴

훨씬 더 간단합니다
Shiva Acharjee

19

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

당신이 문자열을 조작하려면, 고려 StringBuilder또는 StringBuffer경우에 당신은 스레드 안전을 필요로한다.


12

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

21
솔루션이 더 나은 이유는 무엇입니까?
dpp

6

이전에 여기에서 대답했듯이 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();
    }
}

4

다음과 같이 문자열을 덮어 쓸 수 있습니다.

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

문자열 myName은 두 줄과 두 번째 줄의 양쪽에 나타납니다.

따라서 기술적으로 문자열을 변경할 수는 없지만 실제로 덮어 쓰면 편집 가능한 것으로 간주 할 수 있습니다.


나는 당신의 대답을 내려 놓지 않았지만 "덮어 쓰기"라는 용어에 문제가 있음을 인정해야합니다 (그러나 우리는 뒤에 개념에 동의한다고 생각합니다). 개체 자체는 변경되지 않습니다. 변수를 다른 객체를 참조하게하십시오. 그런데 예제에서 최소한 네 개의 String 인스턴스를 생성한다고 언급하는 것이 흥미 롭습니다.
C.Champagne 12

0

내가 주목해야 할 첫 번째 것은 charAt방법이며 등호를 사용하여 값을 할당하면 아무것도하지 않습니다. 문자열을 변경할 수없는 경우 charAt문자열 개체를 변경하려면 메서드에서 새 문자가 포함 된 인수를 받아야합니다. 불행히도 문자열은 변경할 수 없습니다. 문자열을 수정하려면 Petar Ivanov가 제안한 StringBuilder를 사용해야했습니다.


-7

이 작동합니다

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

출력 : domaxokz


1
비록이 StackOverFlow 사이트에서 다른 사람의 작업의 "편집 가능성"을 허용하는이 방법을 강력하게 비난합니다. 철저한 불공정 : /
Diabolus Infernalis

2
구문 오류. 그리고 수정하더라도 첫 번째 'o'를 'x'로 바꾸고 싶다고 말하면 두 번째 'o'도 바뀝니다.
dpp

2
이것은 charAt 4와 동일한 모든 문자를 대체합니다.
Shripad Bhat

1
문제 : myName.replace(myName.charAt(5),'x')당신에게 줄 것 dxmanxkz입니다. 아마도 필요하지 않습니다.
다우드 이븐 카림
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.