Нахождение max (& min) среди значений определенного индекса в серии массивов, которые являются значениями карты - PullRequest
0 голосов
/ 09 ноября 2019

У меня есть структура данных, определенная следующим образом: Массив карт, где каждая карта имеет строковые ключи и массивы двойников в качестве значений. то есть Array [Map [String, Array [Double]]]

Причиной этой структуры является то, что каждый ключ String является идентификатором автомагистрали, а значения представляют собой ширину и длину датчиков движения вдоль автомагистрали. ,У меня есть несколько шоссе, поэтому нужно несколько карт. Теперь мне нужно найти максимальную и минимальную широту (индекс 0) и максимальную и минимальную долготу (индекс 1) для всех датчиков во всей структуре данных.

Я мог бы определенно обработать это с помощью серии циклов традиционным способом, но мне интересно, есть ли какой-нибудь изящный способ сделать это в Scala (я не эксперт в Scala). В конечном счете, это не супер важный вопрос, поскольку я могу сделать это с помощью своих собственных циклов. Просто подумал, что это вызовет интересный вопрос, и если кто-то сможет найти хорошее решение, его стоит выяснить.

Редактировать: Вот более конкретный пример того, как работает структура данных. Здесь R1S1 означает дорогу № 1, датчик № 1 и т. Д.

Массив (Карта («R1S1» -> Массив (32,117), «R1S2» -> Массив (33,118)), Карта («R2S1»)-> Массив (32,116), "R2S2" -> Массив (34,118)))

1 Ответ

1 голос
/ 09 ноября 2019

Если вы можете просто преобразовать свою структуру данных в плоский список из одной части координат, то вы можете вызвать min и max для этого. Если бы вы могли начать изнутри и идти своим путем:

  1. Учитывая самый внутренний Array[Double], вы хотите получить первый элемент (или второй).
  2. Учитывая содержащееmap, вы просто хотите получить значения.
  3. С учетом содержащегося массива сведите массив массивов к одному массиву.
  4. Возьмите максимум результата.

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

// Say how to order Double values    
import Ordering.Double.IeeeOrdering

// Create a dedicated data structure for the coordinates
case class Coordinates(lat: Double, lon: Double)

// Find the minimum latitude value for your data structure
def minLat(world: Seq[Map[String, Seq[Coordinates]]]): Double =
  world               // Seq[Map[String, Seq[Coordinates]]]
    .map { _.values } // Seq[Seq[        Seq[Coordinates]]]
    .flatten          // Seq[            Seq[Coordinates] ]
    .flatten          // Seq[                Coordinates  ]
    .map { _.lat }    // Seq[                Double       ]
    .min

// Let's try it
val aWorld = Seq(Map(("a", Seq(Coordinates(-70, 40)))))
minLat(aWorld)  // -70
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...