2017-01-19 4 views
-1

을 종료하지와 루프 동안 :내가 프로그램 아래 사용하여 문자열에서 연속 중복 문자를 제거하는 프로그램을 쓰고 있어요 부울

static void main(String[] args){ 

String s = "abcdeedcbfgf"; 
removeConsecutiveDuplicate(s); 

} 

    static void removeConsecutiveDuplicate(String s) { 
     String tmp = ""; 
     boolean isEligible = false; 
     for (int i = 0; i < s.length() - 1; i++) { 
      if (s.charAt(i) == s.charAt(i + 1)) { 
       tmp = s.substring(0, i) + s.substring((i + 2), s.length()); 
       System.out.println(tmp); 
       s = tmp; 
       isEligible = true; 
       break; 
      } 
     } 

     System.out.println("s is:" + s); 
     while (isEligible) 
      removeConsecutiveDuplicate(s); 
    } 

는 출력은 다음과 같아야합니다 가 더 연속 된 문자가 없을 때 그것을해야 afgf 잠시 동안 나는 깃발을 사용하고있어. 그러나 깃발은 진실한 가치를 얻고 있습니다.

나는 그것을 어떻게하고 있는지 모른다.

누군가 내가 잘못하고있는 부분을 이해할 수 있습니까?

+0

이것은 isEligible가 처음 선언 된 프레임의 값을 변경하지 않기 때문입니다. 얼마나 오래 갈 것입니까? 왜냐하면 당신이 정말 빨리 힙을 다 써 버릴 것이라고 생각하기 때문에 – CraigR8806

+3

즉'removeConsecutiveDuplicate()'를 호출 할 때마다 isEligible에 새로운 범위와 새로운 값을 생성하고 있습니다. 이 새로운 값은 ** 전송되지 않습니다 ** 처음으로 돌아 오는 동안 루프가 보이지 않습니다 – CraigR8806

+0

'main()'의's' 문자열은 호출 후에 동일하게 유지됩니다 (원하는대로 이후 반환). 메서드를 호출자에게 반환하는 방법을 원할 것입니다. –

답변

1

수정은 반환 당신의 방법에서 새로운 문자열이다 isEligible 전체


또한, 당신은 "문자열의 끝"을 생략하면 내포되어 있기 때문에, substring()에 두 번째 매개 변수를 지정할 필요가 없습니다, 즉 :

s.substring(i, s.length()) 

동일
s.substring(i); 
+0

s.substring (i, s.length)는 일치하지 않는 charcaters를 제거합니다. 코드 아래에서 시도 :

 String removeConsecutiveDuplicate(String s){ \t String tmp = ""; \t \t for (int i = 0; i < s.length() - 1; i++) { \t \t if (s.charAt(i) == s.charAt(i + 1)) { \t \t \t tmp = s.substring(i, s.length()); \t \t \t System.out.println("tmp is:"+tmp); \t \t \t break; \t \t } \t } \t return tmp; \t }
작동하지 않습니다. –

+0

아, 아직도's.substring (0, i)'가 필요합니다. 'ssstring (0, i) + s.substring (i + 2)'를 할 수 있으며, 두 번째 인수는'substring()'에 대한 * 두 번째 호출을 생략합니다. –

+0

@ 보헤미안 : 해결책을 가져 주셔서 감사합니다. 정말 도움이되었습니다. 또한 내가 사용한 방식대로 "while 루프"를 사용할 수없는 이유를 설명 할 수 있습니까? 그리고 당신이 사용한 방식은 일하고 있습니다. 사실, 당신이 사용한 while 회 돌이는 끝이없는 루프가되어야합니다. –

1

while 루프는 while (true)입니다. 당신은 결코 거짓으로 보이지 않습니다. 한 번 적합합니다. 무한 루프로 실행 중입니다. if to if if. while (iseligible) => if (해당 사항 없음).

String s = "abcdeedcbfgf"; 

while (true) { 
    String next = removeConsecutiveDuplicate(s); 
    if (next.equals(s)) 
     break; 
    s = next; 
} 

변수와 개념을 제거 : 그것은 를 변경 한 경우

static String removeConsecutiveDuplicate(String s) { 
    // existing code, except... 
    return tmp; 
} 

그런 다음 호출 방법 확인 :

+0

아니, 나는 그렇게 생각하지 않아. asker는'i

+0

oops !! 내 잘못이야 . 답변이 변경되었습니다. 고마워요 @Ole V.V. – BloomBlack

+0

IF로 바꿨을 때 효과가있었습니다. 하지만 어떻게 이해할 수 없습니까? while 또는 if 중 하나입니다. 재귀 호출을 할 때 isEligible가 false로 변경됩니다. 여기서 나를 도울 수 있니? –