Как разделить список для добавления на карту в Scala - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть некоторые необработанные тестовые данные, которые мне нужно разбить на карту формата:

Карта [Строка, Список [(Int, Int, Int)]]

Мне удалось прочитать данные в виде списка, и я приведу пример одной строки данных ниже:

Mon-18-June-2018,1:10:5,2:20:10,3:30:15,4:40:20,5:50:25

Выше представлено следующее: дата, период для этой даты: время, проведенное при ходьбе: время, проведенное при ходьбе в более высоком темпе

Таким образом, каждый набор из 3 значений (т. Е. 1: 10: 5) должен быть добавлен в раздел карты [Int, Int, Int], где ключом является дата.

Это мой код для чтения файла и добавления его в список:

    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

Я хотел бы написать функцию для разделения данных и добавления их на карту, по сути, делая это:

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)

Как добавить данные на карту в желаемом формате?

Ответы [ 3 ]

1 голос
/ 08 апреля 2019

Приведенная ниже реализация является общей и не зависит от количества параметров, которые вы получаете во время выполнения.

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)

Это даст вам вывод как

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

Однако, если вы уверены, что вы всегда получите параметры в формате 1: 10: 2, вы можете сразу получить реализацию кортежа вместо свертывания по спискам.

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)

Получает вывод как

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)))
0 голосов
/ 08 апреля 2019

Вот решение, которое использует Regex / Pattern Matching:

Начните с созданного вами списка:

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

Мы создаем регулярное выражение для чисел:

val numberRegex = """(\d+):(\d+):(\d+)""".r.unanchored

Теперь мы отображаем список:

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

Это напечатает:

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)))
0 голосов
/ 08 апреля 2019

Вы можете использовать регулярные выражения для извлечения необходимых данных

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

выход:

Map(Mon-18-June-2018 -> List((1,10,5), (2,20,10), (3,30,15), (4,40,20), (5,50,25)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...