1
votes

Comment diviser une liste à ajouter à une carte dans Scala

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é?


0 commentaires

3 Réponses :


2
votes

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)


0 commentaires

0
votes

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


0 commentaires

0
votes

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


0 commentaires