需要访问索引时,用于存储2D数据并对其进行操作的惯用方式

时间:2018-12-27 13:41:02

标签: clojure

我正在使用Advent of Code 2018 Day 6,在其中我需要存储位置的2D地图,然后根据其坐标进行映射+过滤。我正在考虑将位置存储在2D向量中,以便向量的索引表示其坐标,因为这是我在命令式语言中所做的。

但是,大多数序列操作只将元素传递给函数,因此无法从传递给函数的函数访问元素的索引。 map。是的,map-indexed存在,但是每次我对数据进行操作时,都有两个嵌套的调用并不很干净。

我看到一些建议,将索引或本例中的(x,y)坐标对与元素存储在向量[[[0, 0] "loc1"] [[0, 1] "loc2"] ...]中。这将比使用嵌套的map-indexed调用更好,还是有一种更干净,更惯用的替代方法来存储2D数据并使用其索引访问数据?

2 个答案:

答案 0 :(得分:1)

您可以使用matrices

(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)

答案 1 :(得分:1)

对于此特定问题,问题的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每组的大小以得出最终答案。