Идиоматичный способ хранения и работы с 2D-данными, когда необходим доступ к индексам - PullRequest
0 голосов
/ 27 декабря 2018

Я работаю День 6 Появления Кодекса 2018, в котором мне нужно сохранить 2D-карту местоположений, а затем выполнить картирование + фильтрацию по ним на основе их координат.Я думал о сохранении местоположений в двумерном векторе, чтобы индексы векторов обозначали их координаты, как я это сделал бы на императивных языках.

Однако большинство операций с последовательностями передает элемент только функции, поэтому нет доступа к индексу элемента из функции, переданной, например, map.Да, map-indexed существует, но не кажется чистым иметь два вложенных вызова к нему каждый раз, когда я оперирую данными.

Я видел, как некоторые предлагали сохранить индекс, или в этом случае (x,у) пара координат, с элементом в векторе: [[[0, 0] "loc1"] [[0, 1] "loc2"] ...].Будет ли это лучше, чем использование вложенных вызовов map-indexed, или есть даже более чистая, более идиоматическая альтернатива хранению 2D-данных и доступа к данным с их индексом?

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Для этой конкретной проблемы 2D-характер проблемы не имеет значения.Итак, я бы предложил сохранить точки в виде вектора карт, например:

{:x x
 :y y
 :nearest-point :A}

и таких мест, как:

{:x x
 :y y
 :name :A}

, например.Для каждой точки обведите местоположения и сохраните ближайший.Затем выбросьте бесконечные:

(remove #(is-it-infinite? %) points)

Затем

(group-by :nearest-point points)

и count размер каждой группы, чтобы получить окончательный ответ.

0 голосов
/ 27 декабря 2018

Вы можете использовать матрицы :

(require '[clojure.core.matrix :as m])
(def A (m/matrix [[1 4 56] [5 2 8] [35 1 677]]))
(m/emap-indexed (fn [[x y] v] (prn [x y v])) A)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...