2016-11-04 2 views
1

간단히 말해서 사용자가 한꺼번에 여러 줄의 텍스트 (여러 줄)를 콘솔에 붙여 넣으면 그 청크를 잡고 사용할 수 있기를 원합니다.Stdin의 개별 청크를 사용 가능한 형태로 변환

현재 내 코드는하지만 doStuff가 호출되지 않습니다

val stringLines: List[String] = io.Source.stdin.getLines().toList 
doStuff(stringLines) 

입니다. 표준 반복자가 '끝'을 가지고 있지 않다는 것을 알지만, 어떻게 현재의 입력을 얻을 수 있습니까? 나는 많은 SO 답을 확인했지만, 그들 중 누구도 대조 할 필요가있는 여러 행을 위해 일하지 않습니다. 사용자 입력의 모든 라인을 한 번에 가져와야하며 항상 단일 데이터 붙여 넣기로 제공됩니다.

+0

입력 된 두 줄과 천천히 한 줄과 두 줄의 줄을 덩어리로 붙여 넣은 것의 차이점을 어떻게 알 수 있습니까? 각 시간을 타임 스탬프 한 경우 시차 <임계 값은 청크라고 판단 할 수 있습니다. "덩어리가 된"것을 분별하는 또 다른 방법이 있습니까? – jwvh

+0

@jwvh 네, 그렇게 할 수 있습니다. 두 번째 또는 서로에 도착하는 텍스트 블록은 그룹화되어야하며 텍스트는 한 번 또는 두 번만 입력해야합니다. 그 일을 관용적으로하는 법을 제안 해 주시겠습니까? – sudom82

답변

0

이것은 대략적인 개요이지만 작동하는 것 같습니다. 전에 만난 적이없는 Java Executors에 대해 알아봐야 만했습니다. 올바르게 사용하지 않았을 수 있습니다.

시간 초과 값을 가지고 놀고 싶지만 10 밀리 초가 테스트에 합격 할 수 있습니다.

import java.util.concurrent.{Callable, Executors, TimeUnit} 
import scala.util.{Failure, Success, Try} 

def getChunk: List[String] = { // blocks until StdIn has data 
    val executor = Executors.newSingleThreadExecutor() 
    val callable = new Callable[String]() { 
    def call(): String = io.StdIn.readLine() 
    } 

    def nextLine(acc: List[String]): List[String] = 
    Try {executor.submit(callable).get(10L, TimeUnit.MILLISECONDS)} match { 
     case Success(str) => nextLine(str :: acc) 
     case Failure(_) => executor.shutdownNow() // should test for Failure type 
          acc.reverse 
    } 

    nextLine(List(io.StdIn.readLine())) // this is the blocking part 
} 

사용법이 간단합니다.

val input: List[String] = getChunk 
+0

훌륭합니다, 받아 들였습니다. 감사합니다! – sudom82