Compte tenu de la chaîne 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)
5 Réponses :
val path = "/what/an/awesome/path" val file = new java.io.File(path) val prefixes = Iterator.iterate(file)(_.getParentFile).takeWhile(_ != null).toList.reverse
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 code> devient le fichier "nouveau"
code>?
Agréable. +1. Cela donne le répertoire racine comme le premier élément cependant?
@Huynhjl Ajout d'un .drop (1) code> correctement suffisamment facilement :-)
@Tempus oui, il est itérator.iterate (débutvalue) (FonctionToderivivivivivenext) code>. Il existe un certain nombre de méthodes d'usine similaires sur les compagnons de divers types de collecte.
itérateur.Continalement code> 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 code> dessus.
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
Probablement autour de ces lignes chemin.split ("/"). Drop (1) .Scanleft ("") ((S, elem) => s + "/" + elem) .drop (1) code >
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)
Méthode de fantaisie de pantalon de fantaisie:
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.