2014-03-29 8 views
1

나는 스칼라에서 큰 텍스트 파일을 읽을 필요가있다. 그리고 그 파일에 한 줄을 StringBuilder에 추가하십시오. 하지만 그 파일의 줄에 문자열이 포함되어 있으면 루프를 중단해야합니다. 그리고 StringBuilder에 그 String을 추가하고 싶지 않습니다. 예를 들어, java에서 루프 A은 결과 문자열에 "pengkor"을 포함합니다. 루프 B에는 해당 문자열이 포함되어 있지 않지만 루프에는 break 문이 있으며 scala에서는 사용할 수 없습니다. 루프 C에서 나는 for 문을 사용했지만, 동작은 매우 다르며 for은 스칼라로 반복됩니다. 내 주요 관심사는 StringBuilder에 "pengkor" 문자열을 포함하지 않고 파일의 크기 때문에 스칼라 목록에 파일의 모든 내용 (스칼라 또는 기타 목록 작업의 목록 이해 목적으로)을로드하지 않는 것입니다.파일을 읽는 동안 스칼라에서 루프를 끊는 방법은 무엇입니까?

public class TestDoWhile { 

    public static void main(String[] args) { 
     String s[] = {"makin", "manyun", "mama", "mabuk", "pengkor", "subtitle"}; 
     String m = ""; 
     StringBuilder builder = new StringBuilder(); 
     // loop A 
     int a = 0; 
     while (!m.equals("pengkor")) { 
      m = s[a]; 
      builder.append(m); 
      a++; 
     } 
     System.out.println(builder.toString()); 

     // loop B 
     a = 0; 
     builder = new StringBuilder(); 
     while (a < s.length) { 
      m = s[a]; 
      if (!m.equals("pengkor")) { 
       builder.append(m); 
      } else { 
       break; 
      } 
      a++; 
     } 
     System.out.println(builder.toString()); 

     // loop C 
     builder = new StringBuilder(); 
     a = 0; 
     for (m = ""; !m.equals("pengkor"); m = s[a], a++) { 
      builder.append(m); 
     } 
     System.out.println(builder.toString()); 
    } 

} 

답변

4

이렇게하는 한 가지 방법은 루프의 조건으로 부울 값을 사용하는 것입니다.

val lines = Source.fromPath("myfile.txt").getLines() 
val builder = new StringBuilder 
var cond = true 
while(lines.hasNext && cond) { 
    val line = lines.next 
    if(line != "pengkor") { 
    builder ++= line 
    } else cond = false 
} 
//.. do something with the builder 

더 많은 scala-like 방법은 takeWhile을 사용하는 것입니다.

val lines = Source.fromPath("myfile.txt").getLines() 
val builder = new StringBuilder 
lines.takeWhile(_ != "pengkor").foreach(builder ++= _) 

또한 여기에 모습을 가질 수 있습니다 How do I break out of a loop in Scala?을 쉽게

@tailrec 
def continue(buf: Array[Byte]) { 
    val read = in.read(buf); 
    if (read != -1) { 
     sb.append(parse(buf, read)) 
     continue(buf); // recur 
    } 
    // else do not recur = break the loop 
} 
continue(Array.fill(1)(0)) 

을 깨는의 기능 및 continue를 대신 정의 할 수 있습니다

+2

3) 첫 번째 방법과 매우 흡사 한 재귀 사용 –

0

루프 밖으로 속보를 처리하는 다른 방법을 볼 수 논리는 뒤집 힙니다. 끊는 대신 다음 반복을 위해 함수를 호출합니다. 오버 헤드는 함수를 정의하고 호출해야한다는 것입니다. 장점으로, 루프에 의미 론적 이름을 부여하고, 변수를 업데이트하는 대신 인수를 기능적으로 전달하고 루프를 재사용 할 수 있습니다.

관련 문제