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"))