2016-11-16 7 views
0

Я уверен, что этот вопрос может быть дублирован, но я не нашел ответа на этот вопрос. Прошу простить мои невежественные знания Скалы. Я довольно новичок.Как создать Список списка опций [Double] In for loop Scala

Моя цель состоит в том, чтобы перевернуть два списка (с разной длиной) и вернуть List[List[Option[Double]]].

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

def getDoubles(symbol: String, year: Int): Option[Double] = { 
    return Some(140.0) 
} 

// this method loops over list of strings and range of time. returns list of list of Option[Double] 
def checkList(CSV: List[String], time: Range): List[List[Option[Double]]] = { 
    // this variable is whats going to be returned at the end 
    var listOfLists = List[List[Option[Double]]]() 
    // So we are going to loop over our list and our time, and link each element in our list to all the elements in   our time range 
    for { 
    i < -CSV 
    j < -time 
     // the method getDoubles is pretty long, so i just made another version simplfying my question. 
     // get doubles bascially returns Option of doubles 
    } 
    yield (listOfLists = getDoubles(j, i)::listOfLists) 
    return listOfLists 
} 

Приведенный выше код, когда я называю его с более сложными данными, она возвращает:

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

Но я хочу, чтобы вернуть что-то вроде этого:

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

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

+0

Этот случай прост, но в будущем вы должны предоставить фрагмент своих «сложных данных» (: в качестве примера и желаемого вывода для него, чтобы люди могли легко попробовать его в коде своих ответов. – laughedelic

ответ

3

Для этого вам не нужно использовать какие-либо изменяемые переменные. Прежде всего, если вам нужен вложенный список, вам понадобится вложенный for. Затем в yield вы должны написать, как выглядит каждый элемент коллекции, созданный этим for. Это не тело петли, вы не должны делать никаких мутаций там. Итогом является итоговое значение for. Проверьте часто задаваемые вопросы Scala на странице "How does yield work?".

def checkList(csv: List[String], time: Range): List[List[Option[Double]]] = { 
    for { 
    symbol <- csv 
    } yield { 
    for { 
     year <- time.toList 
    } yield getDoubles(symbol, year) 
    } 
} 

Для понимания-это просто синтаксис для комбинации map, flatMap и filter. В этом случае написание его map является более кратким и очень прост:

def checkList(csv: List[String], time: Range): List[List[Option[Double]]] = { 
    csv map { symbol => 
    time map { year => 
     getDoubles(symbol, year) 
    } 
    } 
} 

Смотрите также "What is Scala's yield?" вопрос.

+1

Хорошо объяснил со ссылками, без «избиения вокруг куста», с ясным объяснением «Понимания». Все, что вы сказали, было на месте, и ваше решение ясно дало понять, где мое замешательство. Я растворяю вас. –