2013-04-15 2 views
7

처리를 위해 항목을 반복하면서 앞뒤로 '엿보기'또는 '건너 뛰기'할 루프에 다양한 시나리오가 있습니다.Groovy '반복자를 미리 본다'?

하나의 시나리오는 파일의 줄을 열거하고 있고, 줄의 끝에 다음 줄과 현재 줄을 결합하는 것을 나타내는 '계속'문자가 있습니다. 만약 내가 너무 단순하지 않다면, 다음 줄을 읽고 카운터/인덱스를 충돌시킬 수 있습니다.

필자의 이터레이터에서 이와 같은 패턴이 명확하지는 않다. 내 폐쇄를 종료하지 않고 효과적으로 다음 라인을 소비하려고합니다. 하지만 그게 가능 한지는 모르겠다. 클로저를 사용하는이 반복 패턴을위한 좋은 디자인 패턴이 있습니까? 그래서 덜 매끄러운 루프에 의존 할 필요가 없습니까? 아마도 처리를 위해 아이템을 밀거나 팝핑하기위한 스택을 가진 iterator의 형태일까요?

+3

Processing "Single line." Processing "Long line continuation." Processing "Single line." 
: https://gist.github.com/ataylor284/5389604 – ataylor

답변

1

줄을 결합하는 반복자를 만들 것입니다. 행 계속 예제의 경우 반복자는 해당 생성자의 파일에서 읽은 행을 가져 와서 해당 행에서 읽은 next 메쏘드를 가져 와서 연속 문자를 찾을 때 미리 읽음으로써 연속 문자가 다음에 나오기 전에 해결됩니다 파이프 라인의 단계. 따라서 여러분이 필요로하는 상태 머신은 반복기 내에 포함됩니다.

1

언젠가 전에 비슷한 것을 구현해야했습니다. 각 줄마다 파이프로 구분 된 데이터가있는 큰 파일이 있었고 데이터는 다음 줄에서 계속 될 수 있었지만 다음 줄을 "엿보는"경우에만 알 수있었습니다.

def list = [1, 2, 3, 4, 5, 6, 7] 

list.metaClass.peek = { delegate[-1] } 

assert list.pop() == 7 
assert list.pop() == 6 
assert list.peek() == 5 
assert list.peek() == 5 
assert list.pop() == 5 
assert list.pop() == 4 
assert list.peek() == 3 
0

재미있는 질문 : 나는 슬쩍 방법과 결합 된 스택으로의 ArrayList를 사용했다.

여기서 중요한 문제는 반복을 통해 일부 상태를 전달해야한다는 것입니다. 이 작업을 수행하는

한 가지 방법은 외부 변수를 사용할 수 있었다 (내가 문자열의 배열 대신 파일 및 File#eachLineList#each를 사용하고 여기에,하지만 그들은 유사해야 함) :

def lines = [ 
    "Single line.", 
    "Long \\", 
    "line \\", 
    "continuation.", 
    "Single line." 
] 

def processLine(line) { println "Processing \"$line\""} 

def continuation = '' 
lines.each { line -> 
    line = continuation + line 
    if (line.endsWith('\\')) { 
    continuation = line.take(line.size() - 1) 
    } 
    else { 
    processLine(line) 
    continuation = '' 
    } 
} 

또 다른를 우리가 먼저 처리를 한 후 계속 라인에 가입하고있어이 경우

lines = lines.inject([]) { list, line -> 
    if (list && list[-1].endsWith('\\')) 
    list[-1] = list[-1][0..-2] + line 
    else 
    list << line 
    list 
} 

lines.each { processLine(it) } 

: 방법은 특별히 Collection#inject처럼 interations 불구하고 상태를 수행하기위한 반복자를 사용하는 것입니다.

두 경우 출력은 다음과 같습니다

나는 일반적으로 같은 반복자 주위에 장식을 사용
관련 문제