Одновременная инициализация переменных с картой, содержащей вложенный IndexedSeq - PullRequest
0 голосов
/ 23 марта 2012

Я ищу метод для решения этой проблемы инициализации tuple () с результатом карты, например:

//My current state of cities
val listOfCity = IndexedSeq(new City1(), new City2())

// Function which compute my new state
val (newCity,exchange) = listOfCity.map{ city =>  computeNewCity(city,listOfCity)}    

Переменная newCity содержит результат ._1 моего кортежа, возвращенного computeNewCity() и переменная exchange содержат результат ._2 того же кортежа.

Функция computeNewCity() возвращает новую версию моего объекта-города и историю обмена, результаты моего обмена с другими городамив listOfCity это кортеж типа (City, Exchange)

Как я могу сделать это с помощью функционального программирования?

Спасибо!Sr

Ответы [ 2 ]

2 голосов
/ 23 марта 2012

Проблема в том, что listOfCity.map{ city => computeNewCity(city,listOfCity)} возвращает IndexedSeq[(City, Exchange)] (один кортеж для каждого города в listOfCity), и, очевидно, вы не можете просто присвоить его кортежу (City, Exchange). Вы можете взять первый элемент или последний:

val (firstCity,exchange) = listOfCity.map{ city =>  computeNewCity(city,listOfCity)}.first

val (lastCity,exchange) = listOfCity.map{ city =>  computeNewCity(city,listOfCity)}.last

или получить кортеж из двух последовательностей (городов и соответствующих обменов)

val (cities,exchanges) = listOfCity.map{ city =>  computeNewCity(city,listOfCity)}.unzip
1 голос
/ 23 марта 2012

Это то, что вы пытаетесь сделать?

scala> val Seq(a, b) =  IndexedSeq(IndexedSeq(3.0,2.0), IndexedSeq(1.0))
a: IndexedSeq[Double] = Vector(3.0, 2.0)
b: IndexedSeq[Double] = Vector(1.0)
...