7
votes

Diviser un nom de fichier en chemins absolus dans Scala

Compte tenu de la chaîne xxx pré>

Comment puis-je utiliser Scala pour créer une liste de chemins absolus pour chaque répertoire dans le chemin? Le résultat devrait être: p>

List(/what, /what/an, /what/an/awesome, /what/an/awesome/path)


1 commentaires

Je suis vraiment étonné de toutes les réponses de haute qualité. J'aimerais pouvoir accepter plus d'une réponse, mais comme ce n'est pas possible, j'accepterai le premier correct. Merci de votre soutien.


5 Réponses :


14
votes
val path = "/what/an/awesome/path"
val file = new java.io.File(path)
val prefixes = Iterator.iterate(file)(_.getParentFile).takeWhile(_ != null).toList.reverse

5 commentaires

Je n'ai jamais vu cette méthode auparavant. Pourriez-vous s'il vous plaît dites-moi si je comprenais correctement? Après chaque itération, l'objet renvoyé par .geparentfile devient le fichier "nouveau" ?


Agréable. +1. Cela donne le répertoire racine comme le premier élément cependant?


@Huynhjl Ajout d'un .drop (1) correctement suffisamment facilement :-)


@Tempus oui, il est itérator.iterate (débutvalue) (FonctionToderivivivivivenext) . Il existe un certain nombre de méthodes d'usine similaires sur les compagnons de divers types de collecte. itérateur.Continalement est également intéressant, par exemple. SCALA-LANG.ORG/API/RC/SCALA/Collection /Iteratorá.html


Notez que si le chemin n'est pas déjà à partir de la racine du système de fichiers, vous souhaiterez peut-être .getcanonicalpath dessus.



2
votes
path.drop(1).split("/").foldLeft(List.empty[String])((list, string) => ((list.headOption.getOrElse("") + "/" + string) :: list)).reverse.toList
There's probably a cleaner way using scanLeft, but I wasn't able to figure it out

1 commentaires

Probablement autour de ces lignes chemin.split ("/"). Drop (1) .Scanleft ("") ((S, elem) => s + "/" + elem) .drop (1)




8
votes
val path = "/what/an/awesome/path"

scala> path.tail.split("/").scanLeft(""){_ + "/" + _}.tail.toList
res1: List[java.lang.String] = List(/what, /what/an, /what/an/awesome, /what/an/awesome/path)

0 commentaires

2
votes

Méthode de fantaisie de pantalon de fantaisie: xxx


0 commentaires