2014-12-31 3 views
1

"xxxyyyzzz"문자열을 가져 와서 동일한 문자를 그룹화하는 배열로 분할하려고합니다. 그래서 결과는 [ "xxx", "yyy", "zzz"]가되고 싶습니다. 왜이 코드가 루핑을 계속하는지 잘 모르겠습니다. 어떤 제안?왜이 루프가 멈추지 않습니까?

def split_up(str) 
    i = 1 
    result = [] 
    array = str.split("") 
    until array == [] 
    if array[i] == array[i-1] 
     i += 1 
    else 
     result << array.shift(i).join("") 
    end 
    i = 1 
    end 
    result 
end 

puts split_up("xxxyyyzzz") 
+1

루프 끝에 'i = 1'이 정말로 필요한 것인지 확실하지 않습니다. –

+1

당신은'join'도 필요 없습니다. –

+1

실제로 프로그램을 진행하기 위해'i'가 필요하지만 루프의 매 반복마다 끝에'i = 1'이 있습니다. – meagar

답변

5

귀하의 until 상태가 절대로 나오지 않아 루핑이 발생합니다. 연속 문자가 일치 할 때 i이 증가하지만 루프 끝에서 i1으로 재설정하고 있습니다.

이 섹션을 편집하고이 줄을 추가하는 경우 : i 항상 1, 그리고 코드는 영원히 1 인쇄를 유지하는 것이

until array == [] 
    puts i # new line 

그런 다음 당신이 볼 수 있습니다.

라인을 삭제하십시오. i = 1 라인을 삭제하면 원하는 결과를 얻을 수 있습니다.

또한, Ruby 문자열 scan 메소드 및 패턴 일치 및 캡처 그룹에 대해 읽고 경계선과 일치 할 수있는 미리보기 및 길이가 0 인 표식을 사용하는 것이 좋습니다.

"xxxyyyzzz".scan(/(.)(\1*)/).map{|a,b| a+b } 
=> ["xxx", "yyy", "zzz"] 

scan 방법은이 일을한다 :

  1. . 일치하는 모든 문자 예를 여기

    내가 개인적으로 편지 경계에서 문자열을 분할 달성 할 방법입니다 "x", 그리고 괄호는 이것을 포착합니다.

  2. \1*은 이전 캡처를 원하는 횟수만큼 일치시킵니다 (예 : "xx", 그리고 괄호는 이것을 포착합니다.
  3. 따라서 $ 1은 첫 번째 문자 "x"와 일치하고 $ 2는 모든 반복 "xx"와 일치합니다.

스캔 블록은 첫 번째 문자와 그 반복을 연결하므로 "xxx"를 반환합니다. 상술 한 바와 같이

0

,이 이렇게 스캔을 사용하여 해결 될 수있다 :

def split_up(string) 
    repeat_alphabets = /(\w)(\1*)/ 
    string.scan(repeat_alphabets).map do |match| 
    match[0] << match[1] 
    end 
end 

설명 :

  1. 정규식 문자 반복 일치하지만 인해 정규식 matches occur as pairs of the alphabet and remaining repeated instances의 구성에 관한 것이다.
  2. m[0] << m[1]은 필수 문자열을 형성하기 위해 일치 항목을 조인합니다.
  3. map은 문자열을 배열로 결합하여 배열을 마지막 문으로 반환합니다.
관련 문제