문자열 바꾸기 방법이 문자를 바꾸지 않습니다.


79

문자열로 전달되는 문장이 있고 "and"라는 단어를 바꾸고 있는데 ""로 바꾸고 싶습니다. 그리고 "and"라는 단어를 공백으로 바꾸지 않습니다. 아래는 내 논리의 예입니다. 그리고 이것을 디버그하면 논리가 문장으로 떨어집니다.

String sentence = "Define, Measure, Analyze, Design and Verify"
if (sentence.contains("and")){
    sentence.replace("and", " ");
}

내가 여기에 빠진 것이 있습니까?


33
문자열은 변경할 수 없습니다.
Matt Ball

답변:


171

그리고 이것을 디버그하면 논리가 문장으로 떨어집니다.

예, 그런 다음 반환 값을 버립니다.

Java의 문자열은 변경할 수 없습니다.를 호출 replace하면 기존 문자열 의 내용이 변경되지 않고 수정 된 문자열이 반환 됩니다. 따라서 원하는 :

sentence = sentence.replace("and", " ");

이 적용 모든 문자열 (의 방법 substring, toLowerCase등). 그들 중 어느 것도 문자열의 내용을 변경 하지 않습니다 .

조건에서 실제로이 작업을 수행 할 필요 는 없습니다. 결국 문장에를 포함 하지 않는"and" 경우 대체를 수행해도 해가되지 않습니다.

String sentence = "Define, Measure, Analyze, Design and Verify";
sentence = sentence.replace("and", " ");

2
마감 투표 대신 dup 응답에 대해 전화해야합니다. 이 문제는 이전에 여러 번 질문 및 답변되었습니다. 존, 거래는 무엇입니까?
Matt Ball

2
@MattBall 질문을 반복 요청을 받고있다 동의하는 동안, 나는, IHMO이 더 나은 답변을 생각
MadProgrammer

20
@MattBall : 너무 자주 발생으로, 내가 중복 찾는 것보다 더 빨리 좋은, 완벽한 대답을 찾을 또한 좋은 대답을 가지고 있습니다. 나는 여기서 내 대답이 당신이 발견 한 복제물에서 받아 들여진 것보다 낫다고 믿습니다. ( "실제로 문자열을 문자열에 변경 한 것과 동일하게 만들어야합니다."-뭐?) 추가로, 먼저 격리를 확인할 필요가 없다는 측면을 지적하고 싶었습니다.
Jon Skeet

이것에 대해 생각할 시간이 있었기 때문에 이것이 더 나은 대답이라고 생각합니다.
yams

68

문자열은 변경 불가능 하므로 내용을 변경할 수 없습니다. 전화 replace(this,that)하면 완전히 새로운 문자열로 끝납니다. 이 새 복사본을 유지하려면 변수에 할당해야합니다. 이전 참조 ( sentence = sentence.replace(this,that)아래에 표시된대로 la 또는 새 참조)를 덮어 쓸 수 있습니다 .

public class Test{

    public static void main(String[] args) {

        String sentence = "Define, Measure, Analyze, Design and Verify";

        String replaced = sentence.replace("and", "");
        System.out.println(replaced);

    }
}

제쳐두고, contains()여기서는 불필요한 호출이므로 수표를 제거했습니다 . 포함되지 않은 경우 교체는 교체에 실패합니다. 교체하는 것이 확인하는 실제 조건과 다른 경우에만 포함 메서드를 원할 것입니다.


41
이 답변의 텍스트는 contains()문제를 일으킨 전화 라는 것을 의미합니다 . 불필요한 전화 였지만 실제로 문제를 일으키지는 않았습니다. 문제는의 반환 값을 무시했기 때문에 발생 replace했으며 대답에서 전혀 설명되지 않았습니다.
Jon Skeet

@ Mr. Jon Skeet 나는 대답의 텍스트가 다른 방향을 암시한다면 정말 미안합니다 ...하지만 내가 필요하지 않다고 말했을 때 나는 그것이 필요하지 않다는 것을 의미했습니다. ... 좋아요 나는 그것을 대답 만들기에 포함시킬 것입니다 그것은 더 분명 .....
쿠마 비벡 미트라

당신이 경우에 더 나은되지 않을 것sentence.replace(" and", ",");
Khaled.K

@JonSkeet 및 기타-실제로 무슨 일이 일어나고 있는지 설명하는 단락을 추가하고 실제 문제에 다소 불필요하기 때문에 오해의 소지가있는 텍스트를 끝으로 옮겼습니다.
corsiKa

3
@corsiKa : 솔직히 말해서 다른 사람의 기존 답변에 대한 편집으로 그렇게하지 않았을 것입니다. 대답의 의미를 상당히 크게 바꾸고 있습니다.
Jon Skeet

9

반환 값으로 아무것도하지 않습니다 replace. 새로운 메서드 인 결과를 할당해야합니다 String.

sentence = sentence.replace("and", " ");

A String는 Java에서 변경할 수 없습니다. 방법 좋아하는 replace새를 반환 String.

귀하의 contains시험은 불필요 : replace이 경우 단지 무 조작 할 수없는 텍스트의 인스턴스가 대체 없습니다.


이것을 대체하고 싶지 않은 경우가 있기 때문에 내 포함 논리가 필요합니다. 논리는 이렇지 않습니다. 저는 이것을 예로 사용했습니다.
yams

@MarkBasler : 제공 한 샘플에는 포함 논리가 필요하지 않으므로 포함하지 않아야합니다. 좋은 질문은 문제를 보여주는 데 필요한 것만 포함해야합니다. 제공 한 상황에서 무의미한 코드를 포함하여 질문에주의를 산만하게했습니다.
Jon Skeet

나는 격리에 관심이 있었고 교체에 관심이 있었다.
yams

그건 그렇고 당신은 그것을 중복으로 표시하고 대답하십시오. 품위 유지.
yams

안녕하세요 @MarkBasler : 도와 주려고 노력하고있었습니다. 나는 두 가지 행동과의 충돌을 보지 않는다. 당신의 문제는 항상 질문을받는 매우 흔한 문제였다. 자바 문자열은 불변이다. 질문을 중복으로 표시 할 때 여기에서 질문과 답변의 질을 높이려고 노력하고 있지만 동시에 귀하의 질문에 대한 구체적인 답변을 남기면서 귀하의 예에 따라보다 즉각적인 도움을 제공하고자했습니다. . 메타에 대한이 질문이 유용 할 수 있습니다 .
pb2q

8

다음과 같이 교체 결과를 다시 할당해야합니다.

 sentence = sentence.replace("and", " ");

주의하십시오 String클래스는 불변의 의미, 모든 메서드의 새로운 문자열을 반환 결코 현재 위치에서 원래 문자열을 수정하지의 인스턴스의 메서드를 호출 한 결과, 그래서 String변수에 할당해야하거나 즉시 사용 변경 사항이 적용됩니다.


문자열은 변경 불가능해야하지만 문자열 라이브러리에는 원래 문자열을 수정할 수있는 버그가 있습니다.
yams

4
@MarkBasler : 음, 정확히 무슨 버그에 대해 이야기하고 있습니까? 당신이 문자열은 불변 알고 있다면 당신은 모든 직장에 코드를 예상하는 이유, 그것은 ... 불분명
존 소총

-1
package com.tulu.ds;

public class EmailSecurity {
    public static void main(String[] args) {
        System.out.println(returnSecuredEmailID("sample717@gmail.com"));
    }
    private static String returnSecuredEmailID(String email){
        String str=email.substring(1, email.lastIndexOf("@")-1);
        return email.replaceAll(email.substring(1, email.lastIndexOf("@")-1),replacewith(str.length(),"*"));
    }
    private static String replacewith(int length,String replace) {
        String finalStr="";
        for(int i=0;i<length;i++){
            finalStr+=replace;
        }
        return finalStr;
    }   
}

3
코드 전용 답변을 작성하지 말고 대신 코드가 OP 문제를 어떻게 해결하는지 설명하십시오. 리뷰에서
abccd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.