当需要访问索引时存储和操作 2D 数据的惯用方法



我正在工作代码2018降临的第6天,我需要存储位置的2D地图,然后根据它们的坐标对它们进行映射+过滤。我正在考虑将这些位置存储在 2D 向量中,以便向量的索引表示它们的坐标,因为这就是我在命令式语言中这样做的方式。

但是,大多数序列操作仅将元素传递给函数,因此无法从传递给例如 map .是的,map-indexed存在,但是每次对数据进行操作时,对它进行两次嵌套调用感觉不是很干净。

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

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

您可以使用矩阵:

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