2012-08-24 4 views
1

헤더와 바닥 글 문자열이 포함 된 문자열 목록을 채우지 않아도됩니다. 주요 내용은 로컬로 읽은 파일입니다. 아래 'textFile'텍스트 파일에는 문자열 목록이 들어 있습니다. 여기 문자열 목록을 별도의 목록으로 채우는 방법

내가 노력하고있어입니다 : 목록이 불변이므로

 var fileList = List[String]() 
    val bigFile = io.Source.fromFile("d:\\textFile.txt") 
    val groupedLines = bigFile.getLines.grouped(20000).zipWithIndex 
    groupedLines.foreach(group => { 
     val (lines, index) = group 
     fileList.addString(new StringBuilder("begin")) 

     //How can I add the contents of the file here to the val fileList ??? 
     fileList.add(lines.) 
     fileList.addString(new StringBuilder("end")) 
    } 

답변

2

다음 방법은 스칼라 훨씬 더 자연 없습니다 :

val bigFile = io.Source.fromFile("textFile.txt") 
val groupedLines = bigFile.getLines.grouped(20000) 
val fileList = groupedLines.flatMap("begin" +: _ :+ "end").toList 

없음 var의, 변경 가능한 컬렉션, 또는 필요 접는.

val fileList = groupedLines.map("begin" +: _ :+ "end").flatten.toList 

이것은 flatMap 버전과 같은 관용적 아니지만, 우리가 좀 더 명확하고있는 일 수 : 같이 동등하게 마지막 줄을 쓸 수 우리가 각 그룹을 bookending 후 분쇄하고 그들 모두 함께.

+0

어떤 작업이 마지막 줄에서 성취합니까? 이유는 묻지 않는 이유는 마지막 줄이 컴파일되지 않는 것입니까? –

+0

이것은 placeholder 구문이라고 불리는데, 이것은 groupedLines.flatMap (x => "begin"+ : x : + "end"). toList'의 줄임말입니다. 그것은 작동해야합니다 (나를 위해). 오류 메시지가 무엇입니까? –

4

, 나는 당신이 원하는 것 중 하나를 생각 :

변경할 수 있으며 데이터를 추가 할 수 있도록 사용하십시오 ListBuffer :

val fileList = new ListBuffer[String]() 
fileList += "begin" 

또는 새로운 구조를 생산하는 groupedLines에 foldLeft를 사용하여 시도 할 수 :

groupedLines.foldLeft(List[String]()){ (newList, items) => 
    newList ::: "begin" :: items._1 ::: "end" :: Nil 
} 
2

폴드 나 재귀를 사용하는 것이 더 좋은 스타일 일 수 있지만 직접 질문에 대답하려면 매번 fileList의 참조를 새 목록으로 변경해야합니다. 왜 그냥 문자열 목록을 원한다면 StringBuilder으로 어지러운 이유를 모르겠다.

List은 앞에 추가 할 경우 사용할 수 있지만 마지막에 모든 것을 뒤집을 수 있지만 추가 할 컬렉션에는 적합하지 않습니다. 나는 Vector을 사용 싶지만, 여기가 List 함께 :

fileList ::= "begin" 
lines foreach {fileList ::= _} 
fileList ::= "end" 

을 다음 groupedLines foreach 블록

fileList = fileList.reverse 

노트, a ::= ba = b :: a에 대한 문법 설탕 후.

관련 문제