Как суммировать число Ints и количество чисел в списке - Scala - PullRequest
2 голосов
/ 15 апреля 2020

Мне нужно вычислить количество целых чисел и чисел, которые у меня есть на карте, например, Map[String, List[(Int, String, Float)]]

Данные получены при чтении файла - данные внутри, например, выглядят примерно так (как бы то ни было еще несколько маршрутов):

Cycle Route (City),1:City Centre :0.75f,2:Main Park :3.8f,3:Central Station:2.7f,4:Modern Art Museum,5:Garden Centre:2.4f,6:Music Centre:3.4f

Карта разделена таким образом, что строка является именем маршрута, а список - остальной частью данных.

Я хочу, чтобы он вычислил количество «контрольных точек» на маршрут и общее расстояние каждого маршрута (которое является поплавком), а затем распечатал, например, Oor Wull ie Маршрут имеет 6 контрольных точек и общее расстояние 18,45 км.

Я предполагаю, что мне нужно использовать foldLeft, но я не уверен, как это сделать?

Пример простого сгиба, который я сделал раньше, но не уверен, как применить один к вышеуказанному сценарию?

val list1 = List.range(1,20)

def sum(ls:List[Int]):Int = {
  ls.foldLeft(0) { _ + _}
}

1 Ответ

3 голосов
/ 15 апреля 2020

Вы можете сделать это со сгибом, но IMO это не нужно.

Вы знаете количество контрольных точек, просто взяв размер списка (предполагая, что каждая запись в списке является контрольной точкой).

Чтобы вычислить общее расстояние, вы можете сделать:

def getDistance(list: List[(Int, String, Float)]): Float = 
  list
    .iterator // mapping the iterator to avoid building an intermediate List instance
    .map(_._3) // get the distance Float from the tuple
    .sum // built-in method for collections of Numeric elements (e.g. Float)

А затем получить распечатку как:

def summarize(routes: Map[String, List[(Int, String, Float)]]): Unit =
  for { (name, stops) <- routes } {
    val numStops = stops.size
    val distance = getDistance(stops)
    println(s"$name has $numStops stops and total distance of $distance km")
  }

Если вы действительно хотите вычислить оба numStops и distance через foldLeft, комментарий Луиса по вашему вопросу - это способ сделать это.

edit - по запросу Луиса, добавив здесь свой комментарий и немного его очистив :

stops.foldLeft(0 -> 0.0f) { 
   // note: "acc" is short for "accumulated"
   case ((accCount, accDistance), (_, _, distance)) => 
     (accCount + 1) -> (accDistance + distance) 
}
...