2016-11-16 9 views
1

Этот вопрос может быть дублирован, однако я не сталкивался с вопросом, который отвечает на мою проблему.Как получить текущий и следующий элемент списка списка опций в scala

Так что у меня List[ List[ Option[ Double ] ] ]

со следующими данными:

var tests = List(
    List(Some(313.062468), Some(27.847252)), 
    List(Some(301.873641), Some(42.884065)), 
    List(Some(332.373186), Some(53.509768)) 
) 

я хотел бы вычислить это уравнение:

def findDifference(oldPrice: Option[Double], newPrice: Option[Double]): Option[Double] = { 
    return Some((newPrice.get - oldPrice.get)/oldPrice.get) 
} 

на следующее:

Это делая расчет по элементу из двух списков:

(Some(301.062468) - Some(313.062468))/Some(313.062468)

(Some(332.373186) - Some(301.873641))/Some(301.873641)

(Some(42.884065) - Some(27.847252))/Some(27.847252)

(Some(53.509768) - Some(42.884065))/Some(42.884065)

Результат должен вернуться: #

List(
    List(Some(-0.03573991820699504), Some(0.5399747522663995)) 
    List(Some(0.10103414428290529), Some(0.24777742035415723)) 
) 

Мой код до сих пор

def findDifference(oldPrice: Option[Double], newPrice: Option[Double]): Option[Double] = { 
    return Some((newPrice.get - oldPrice.get)/oldPrice.get) 
} 

def get_deltas(data: List[List[Option[Double]]]): List[List[Option[Double]]] = { 
    for { 
    i <- data 
    // So this is where I am stuck. I have the current element i, but I need the same index element in the next list 
    } (findDifference(i,?) } 

Мой выход Если я печатаю мой я в Фор-осмыслению

List(Some(313.062468), Some(27.847252)) 
 
List(Some(301.873641), Some(42.884065)) 
 
List(Some(332.373186), Some(53.509768))

Где я застрял?

Я застрял в том, что не знаю, как получить элемент одного индекса в списке 1 из списка 2 и списка 3 и выполнить необходимый расчет?

Пожалуйста, помогите мне достичь мой вывод результата

+0

В чем смысл обертывания ваших значений с помощью 'Some', когда вы разворачиваете все возможные значения с помощью' .get' в вашем методе 'findDifference'? –

+0

1 - Таким образом, вы не можете использовать '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''. 2 - Ваш код будет генерировать исключение во время выполнения, если любой из этих параметров «Нет». (Для чего нужны варианты.) 3 - Я думаю, что ваше представление данных слишком сложно. – jwvh

+0

Ive добавил некоторые, чтобы объяснить мою проблему. Его не требуется внутри. Я просто не знаю, как сделать расчет. Есть ли способ сделать это? @jwvh –

ответ

0

Пытаться играть с этим:

object OptIdx { 

    def main(args: Array[String]) { 
    println(get_deltas(tests)) 
    } 

    var tests = List(
    List(Some(313.062468), Some(27.847252)), 
    List(Some(301.873641), Some(42.884065)), 
    List(Some(332.373186), Some(53.509768))) 

    def findDifference(oldPrice: Option[Double], newPrice: Option[Double]): Option[Double] = { 
    Some((newPrice.get - oldPrice.get)/oldPrice.get) 
    } 

    def get_deltas(data: List[List[Option[Double]]]): List[List[Option[Double]]] = { 
    (for { 
     index <- 0 to 1 
    } yield { 
     (for { 
     i <- 0 to data.length - 2 
     } yield { 
     findDifference(data(i)(index), data(i + 1)(index)) 
     }).toList 
    }).toList 
    } 

} 

Он печатает цифры, которые вы хотите, но два из них поменялись местами. Я уверен, вы можете понять это.

+0

Мне нравится, как вы это сделали, и это работает как шарм, но я старался внимательно изучить, почему его заменяют. Не знаю. Какие-нибудь подсказки? –

+0

@NaseebullahSafi: играйте с индексами и со значениями. Используйте номера, которые вы можете проверить вручную. поменять внешний контур и внутренний, и т. д. – radumanolescu

+0

Да, приветствует человека. Исправлено: –

0

Таким образом, ваша структура данных означает, что i - это список из двух вариантов.Значения, которые нужно там уже так можно назвать i(0) и i(1)

Я сделал быстрый и грязный в РЕПЛ:

scala> val tests = List(
    | List(Some(313.062468), Some(27.847252)), 
    | List(Some(301.873641), Some(42.884065)), 
    | List(Some(332.373186), Some(53.509768)) 
    |) 
tests: List[List[Some[Double]]] = List(List(Some(313.062468), Some(27.847252)), List(Some(301.873641), Some(42.884065)), List(Some(332.373186), Some(53.509768))) 

И здесь вы можете увидеть значение I, когда я называю :

scala> for { i <- tests } println(i) 
List(Some(313.062468), Some(27.847252)) 
List(Some(301.873641), Some(42.884065)) 
List(Some(332.373186), Some(53.509768)) 

Таким образом, вы можете позвонить findDifference таким образом:

scala> def findDifference(oldPrice: Option[Double], newPrice: Option[Double]): Option[Double] = { 
    | Option((oldPrice.get - newPrice.get) /oldPrice.get) 
    | } 
findDifference: (oldPrice: Option[Double], newPrice: Option[Double])Option[Double] 

scala> for { i <- tests } println(findDifference(i(0), i(1))) 
Some(0.911048896477747) 
Some(0.8579403459740957) 
Some(0.8390069648999904) 
+0

Есть более эффективные способы структурирования ваших данных. Сначала вы можете создать класс case 'Цены (oldPrice: Option [Double] newPrice: Option [Double]) ' который должен сделать ваш код более удобным для выполнения, поскольку вы можете вызвать params по имени и т. д. Если вы всегда будете получать цену, вам может не понадобиться использовать параметры вообще –