【问题标题】:clojure check if value in vector in vector in vector equals anotherclojure 检查向量中的向量中的值是否等于另一个向量
【发布时间】:2014-06-10 04:08:01
【问题描述】:

基本上我在向量中,在向量中都有向量,并且那些最深的向量包含两个坐标点。例如 [[[3 4] [4 5]] [[5 6] [6 7]]] 我想检查某个 x 和 y 值是否与内部的任何坐标点匹配,如果匹配,则返回 -1。我试过这样做,但该功能不起作用。

    (defn check-for-stuff
      [vect x y]
      (if (not (empty? vect)) 
        (dotimes [n (count vect)]
          (if (not (empty? (vect n)))
            (dotimes [p (count (vect n))]
              (if (and (= (((vect n) p) 0) x)
                       (= (((vect n) p) 1) y))
                -1
                ))))))

【问题讨论】:

  • 为什么要使用这种数据结构?如果你要搜索给定的内容是否存在,索引的东西——集合或哈希映射——会更快(摊销 O(1) 而不是 O(n))。
  • ...而且,作为额外的奖励,这意味着您可以使用(contains? points point)。 (单独比较 xy 是愚蠢的,因为您可以将它们作为单位进行比较)。
  • ...另外,在一般的 Clojure 中,任何名称中带有 do 的东西都应该用于副作用,而不是计算。
  • 仅供参考——第一个答案有一些错误;将其编辑为现在实际测试过的内容。
  • ...顺便说一句,为什么-1?如果未找到匹配项,则返回 nilfalse 是常规的,否则返回任何真实值(也就是说,除 nilfalse 之外的任何值)。

标签: vector clojure


【解决方案1】:

对于这个问题的字面答案,这是我的第一次尝试:

(defn check-for-stuff [vect x y]
  (when (some (fn [v] (some #(= % [x y]) v)) vect)
    -1))

测试中的观察值:

(check-for-stuff [[[1 2] [3 4]]] 1 2)
-1

(check-for-stuff [[[1 2] [3 4]]] 1 3)
nil

也就是说——以上是不好的做法,因为它需要遍历提供的向量(因此具有 O(n) 性能),而不是能够将恒定时间的成员资格检查作为哈希映射或设置即可。

此外,对于真实结果返回更有意义的值会更传统,如果不存在这样的有意义的值,则返回 true

【讨论】:

    【解决方案2】:

    @CharlesDuffy 说得对,因为这不是这样的理想结构。根据您对您正在做的事情的描述,我会推荐一组 x-y 向量(代表点)。例如:

    #{#{[3 4] [4 5]} #{[5 6] [6 7]}}
    

    这是一个表示 2 个平面的集合,每个平面表示为一组 x-y 向量。要确定这些集合中的任何一个是否包含给定的 x-y 点,您可以使用somecontains?,如下所示:

    (defn check-for-stuff [planes x y]
      (some #(contains? % [x y]) planes))
    

    正如@CharlesDuffy 也指出的那样,-1 可能不是用作返回值的最佳值。当您编写一个函数来检查集合内部的特定值并告诉您它是否在其中时,Clojure 中惯用的做法是利用 Clojure 中“真实性”的工作方式。除了falsenil,每个值都被认为是“真实的”。在上面的函数中,some 返回包含[x y] 的平面(如果它存在于planes 中)或nil。您可以像返回truefalse 一样使用此函数的返回值,如下所示:

    (if (check-for-stuff #{#{[3 4] [4 5]} #{[5 6] [6 7]}} 4 5)
      (println "point found")
      (println "point not found"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-24
      • 1970-01-01
      • 2017-04-07
      • 2015-12-14
      • 2016-01-29
      • 2014-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多