2016-03-19 7 views
0

Ich verwende den folgenden Code zum Durchlaufen von Verzeichnissen und Hinzufügen von Dateien zu einem mutable Map von mutable ListBuffer. Der Schlüssel ist der Verzeichnisname und die Werte sind die Liste der Dateien in diesem Verzeichnis.Scala 2.10: Konvertieren veränderbare Map of ListBuffer in schreibgeschützte Datenstruktur

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]]) 
    } 

Wie konvertiere ich den Rückgabewert Map[String, List[String]]? Gibt es einen "funktionaleren" Weg, um das gleiche Ergebnis zu erzielen?

Antwort

0

Das java.nio.file Paket hat sowohl SimpleFileVisitor als auch Files, was dies viel einfacher machen sollte. Unterklasse SimpleFileVisitor, überschreiben preVisitDirectory und visitFile; dann fahre es mit Files.walkFileTree.

Aber die allgemeine Antwort auf Ihre Frage ist, dass dies ein Falte Betrieb, so dass Ihre vorhandenen Code verwenden es so etwas wie aussehen:

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

ich auch eine Vector verwenden würde, anstatt ein List, da Listen O (n) sind, um jedes Element am Ende einzufügen.

+0

@Neel Können Sie entweder die Antwort akzeptieren oder erklären, warum es nicht für Sie funktioniert, damit es verbessert werden kann? Vielen Dank ! – eliasah