Как получить доступ к спискам списков на карте в Scala? - PullRequest
3 голосов
/ 09 апреля 2019

У меня есть карта формата

scala.collection.mutable.Map[String,List[(Int, Int, Int)]]

и я хочу иметь доступ к отдельным Int. Формат данных для отображения на карте всегда будет

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

Где дата является ключом карты, а каждый набор из трех чисел - (Int, Int, Int)

Пока мне удалось распечатать карту в этом формате

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

Используя код ниже

map.keys.foreach{i =>
    println(i)
    println(map(i))    

Я бы хотел иметь возможность доступа к отдельным значениям в кортежах. Например, я хотел бы иметь возможность добавлять каждое второе и третье значение каждого кортежа вместе
(1,10,5)
(2,20,10)
(3,30,15)
(4,40,20)
(5,50,25)

чтобы получить
(6,150,75)

Как мне это сделать?

Ответы [ 3 ]

4 голосов
/ 09 апреля 2019

Вы можете использовать сопоставление с образцом для доступа к элементам кортежа.

val dateMap :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)))

dateMap.values.map(_.fold((1,0,0)){case ((a,b,c),(x,y,z)) => (a+1,b+y,c+z)})
//res0: Iterable[(Int, Int, Int)] = List((6,150,75))
2 голосов
/ 09 апреля 2019

Самый простой способ:

val yourMap : 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)))
yourMap.map(x=> (x._2.length+1,x._2.map(_._2).sum,x._2.map(_._3).sum))

Вы можете найти больше форм здесь: Scala: Как суммировать список кортежей

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

Чтобы получить каждое отдельное значение в списке, вы можете .map внутри него.

Чтобы получить каждый элемент кортежа, используйте tuple._1, tuple._2, tuple._3 и т. Д.

В вашем случае, чтобы сложить все значения кортежей вместе, вы можете сделать что-то вроде этого:

val m = scala.collection.mutable.Map[String,List[(Int, Int, Int)]](
  "Mon-18-June-2018" -> List((1, 10, 5), (2, 20, 10), (3, 30, 15), (4, 40, 20), (5, 50, 25))
)

m.map {
  // get keys and values
  case (k, v) =>
    // construct a Tuple of all of the sums
    (v.map(_._1).sum, v.map(_._2).sum, v.map(_._3).sum)
}
// ArrayBuffer((15,150,75))

Это создаст список кортежей ((Int, Int, Int)), где каждый кортеж соответствует ключу в исходной карте. Вы можете даже сохранить ключи оригинальной карты, выполнив что-то вроде этого:

m.map{
  // get keys and values
  case (k, v) =>
    // "x -> y" creates a Tuple, or in this case a Map
    k -> (v.map(_._1).sum, v.map(_._2).sum, v.map(_._3).sum)
}
// Map(Mon-18-June-2018 -> (15,150,75))
...