2016-03-19 6 views
0

次のコードを使用して、mutable Mapのファイルをmutable ListBufferに追加しています。キーはディレクトリ名で、値はそのディレクトリの下にあるファイルのリストです。Scala 2.10:ListBufferのマップを読み取り専用のデータ構造に変換する

def WalkDir(path:String): scala.collection.mutable.HashMap[String,scala.collection.mutable.ListBuffer[String]] = { 

     def collectFiles(p:Path, allFiles: scala.collection.mutable.HashMap[String,scala.collection.mutable.ListBuffer[String]]): = { 

      val fileIterator = ... //List all the files 
      while (fileIterator.hasNext()) { 
       val f = fileIterator.next() 

       if (f is not directory) { // pseduo code 
        val dir = f.getDir() // pseudo code 
        if (! allFiles.contains(f.getDir().toString()) 
         { 
         val files = new scala.collection.mutable.ListBuffer[String] 
         files += (f.path().toString()) // psudeo-code file path 
         allFiles.put(dir.toString(), files) 
        } 
        else { 
          val t_list = allFiles.get(dir.toString() 
          allFiles.put(dir.toString(), t_list += f.path().toString()) 
        } 
      } 
       if (f is directory) collectFiles(f.getPath(), allFiles) 

     } 

      collectFiles(path, new scala.collection.mutable.HashMap[String, scala.collection.mutable.ListBuffer[String]]) 
    } 

戻り値をMap[String, List[String]]に変換する方法はありますか?同じ結果を達成するためのより機能的な方法がありますか?

答えて

0

java.nio.fileパッケージには、SimpleFileVisitorFilesの両方があり、これははるかに簡単になります。サブクラスSimpleFileVisitorは、preVisitDirectoryvisitFileを上書きします。 Files.walkFileTreeでそれを運転してください。私もVectorの代わりに使用したい

filesIterator.foldLeft(Map.empty[String, Seq[String]]) { case (map, file) => 
    ... 
    // return an updated map 
    map + (dir -> updatedVector) 
} 

:あなたの質問に

しかし、より一般的な答えはこれがそうあなたの既存のコードを使用して、操作であるということです、それは次のようになりList、リストは各要素を最後に挿入するためのO(n)です。

+0

@ニールあなたは答えを受け入れるか、なぜそれが改善できないのか説明してください。ありがとう! – eliasah

関連する問題