2016-03-19 16 views
0

Aşağıdaki kodları kullanarak dizinleri katlayıp dosyaları mutable Mapmutable ListBuffer'a ekleyebilirsiniz. Anahtar, dizin adıdır ve değerler, bu dizinin altındaki dosyaların listesidir.Scala 2.10: Değişkeni dönüştürmek ListBuffer'ın eşzamanlı veri yapısına eşlemesi

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

nasıl Map[String, List[String]] döndürülen değeri dönüştürmek için? Aynı sonucu elde etmek için daha 'işlevsel' bir yol var mı?

cevap

0

java.nio.file paketinin her ikisi de SimpleFileVisitor ve Files ürününü çok daha kolay hale getirmelidir. preVisitDirectory ve visitFile'u geçersiz kılan Alt sınıf SimpleFileVisitor; daha sonra Files.walkFileTree ile sürün.

Ama sorunuza daha genel cevabı bu yüzden böyle bir şey olmazdı mevcut kodu kullanarak, bir kat operasyon olmasıdır: Bir de yerine Vector kullanmayı tercih ediyorum

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

List, çünkü listeler her bir öğeyi sonuna eklemek için O (n).

+0

@Neel Ya cevabı kabul edebilir misiniz, yoksa neden işe yaramadığını açıklayabilir misiniz? Teşekkürler ! – eliasah