J'ai des données de test brutes que je dois diviser en une carte de format:
Map [String, List [(Int, Int, Int)]]
J'ai réussi à lire dans les données sous forme de liste et donnera un exemple d'une ligne de données ci-dessous:
var key ="Mon-18-June-2018" var newList = List((1,10,5),(2,20,10),(3,30,15),(4,40,20),(5,50,25)) mapBuffer = mapBuffer ++ Map(key -> newList)
Ce qui précède représente ce qui suit: Une date, une période pour cette date: temps passé marche: temps passé à marcher à un rythme plus rapide
Donc, chaque ensemble de 3 valeurs (ie 1: 10: 5) doit être ajouté à la section [Int, Int, Int] de la carte, avec la date étant la clé.
Voici mon code jusqu'à présent pour lire le fichier et l'ajouter à une liste:
var mapBuffer: Map[String, List[(Int, Int, Int)]] = Map() val fitnessData = "C:\\Users\\ritch\\IdeaProjects\\Coursework\\src\\data.txt" val lines = Source.fromFile("C:\\Users\\ritch\\IdeaProjects\\Coursework\\src\\data.txt").getLines.toList
Je voudrais écrire une fonction pour diviser les données et les ajouter à une carte, en faisant essentiellement ceci:
Mon-18-June-2018,1:10:5,2:20:10,3:30:15,4:40:20,5:50:25
Comment puis-je ajouter les données à une carte dans le format souhaité?
3 Réponses :
L'implémentation ci-dessous est générique et ne dépend pas du nombre de paramètres que vous obtenez au moment de l'exécution.
res0: scala.collection.mutable.Map[String,List[(Int, Int, Int)]] = Map(Mon-18-June-2018 -> List((1,10,5), (2,20,10), (3,30,15), (4,40,20), (5,50,25)))
Cela vous donnera une sortie comme
val line = "Mon-18-June-2018,1:10:5,2:20:10,3:30:15,4:40:20,5:50:25" val arr = line.split(",") val map = scala.collection.mutable.Map[String,List[(Int,Int,Int)]]() val key = arr(0) val values = arr.toList.drop(1).map{ case str : String => str.split(":").map(_.toInt).foldLeft(List[Int]())( (acc,res) => acc :+ res ) }.map(x => (x(0),x(1),x(2))) map += (key -> values)
Cependant, si vous êtes sûr que vous obtiendrez toujours les paramètres au format de 1: 10: 2, alors vous pouvez tout de suite avoir une implémentation de tuple au lieu de replier les listes.
res0: scala.collection.mutable.Map[String,List[List[Int]]] = Map(Mon-18-June-2018 -> List(List(1, 10, 5), List(2, 20, 10), List(3, 30, 15), List(4, 40, 20), List(5, 50, 25)))
Cela récupère une sortie comme
val line = "Mon-18-June-2018,1:10:5,2:20:10,3:30:15,4:40:20,5:50:25" val arr = line.split(",") val map = scala.collection.mutable.Map[String,List[List[Int]]]() val key = arr(0) val values = arr.toList.drop(1).map{ case str : String => str.split(":").map(_.toInt).foldLeft(List[Int]())( (acc,res) => acc :+ res ) } map += (key -> values)
Vous pouvez utiliser regex pour extraire les données requises
Map(Mon-18-June-2018 -> List((1,10,5), (2,20,10), (3,30,15), (4,40,20), (5,50,25)))
sortie:
val x = "Mon-18-June-2018,1:10:5,2:20:10,3:30:15,4:40:20,5:50:25" val regex = "[0-9]+:[0-9]+:[0-9]+".r println(Map(x.takeWhile(!_.equals(',')) -> regex .findAllIn(x) .toList .map(_.split(":").toVector).map{ case Vector(a,b,c) => (a,b,c) } ))
Voici une solution qui utilise Regex / Pattern Matching:
Commencez par votre liste que vous avez créée:
Map(Mon-18-June-2018 -> List((1,10,5), (2,20,10), (3,30,15), (4,40,20), (5,50,25)), Mon-19-June-2018 -> List((22,10,5), (2,220,10), (3,33,15), (4,40,20), (5,50,25)))
Nous créons une expression régulière pour les nombres: p >
val result: Map[String, List[(Int, Int, Int)]] = allLists.map { case date :: (numbers:Seq[String]) => date -> // the first entry is the date numbers.map { // map the rest (numbers list) case numberRegex(x, y, z) => (x.toInt, y.toInt, z.toInt) } }.toMap
Maintenant, nous mappons sur la liste:
val numberRegex = """(\d+):(\d+):(\d+)""".r.unanchored
Cela imprimera:
val allLists: List[List[String]] = List(List("Mon-18-June-2018", "1:10:5", "2:20:10", "3:30:15", "4:40:20", "5:50:25"), List("Mon-19-June-2018", "22:10:5", "2:220:10", "3:33:15", "4:40:20", "5:50:25"))