【问题标题】:Finding the "middle element" from a vector in Clojure从 Clojure 中的向量中查找“中间元素”
【发布时间】:2013-03-25 12:01:22
【问题描述】:

Clojure 中的简单新手问题...

如果 Clojure 向量中有奇数个元素,如何提取“中间”值?我已经看了一段时间了,不知道该怎么做!

一些例子:

  • (middle-value [0]) 应该返回 [0]
  • (middle-value [0 1 2]) 应该返回 [1]
  • (middle-value [0 1 :abc 3 4]) 应该返回 [:abc]
  • (middle-value [0 1 2 "test" 4 5 6]) 应该返回 ["test"]

【问题讨论】:

  • 元素个数为偶数时应该返回什么?
  • @Jeremy Heiler - 永远不会发生,所以我不担心

标签: clojure


【解决方案1】:

如何计算中间索引并通过它访问?

(defn middle-value [vect]
  (when-not (empty? vect)
    (vect (quot (count vect) 2))))

【讨论】:

  • 你可以使用(quot (count vect) 2)
【解决方案2】:

一个有点低效但有趣的实现(使用序列抽象而不是具体向量):

(defn middle [[fst & rst]]
  (if-not rst fst
    (recur (butlast rst))))

如果元素数量是偶数,则返回nil

不那么有趣但更高效:

(nth v (quot (count v) 2))

其中v 是向量。

【讨论】:

  • 当没有更多元素时,解构将使rst为nil,因此您不需要seq
【解决方案3】:

获取向量中的项目数,将其减半,将结果取底并获取该索引处的项目。假设一个向量v

(get v (floor (/ (count v) 2)))

很遗憾floor 不在clojure.core 中,您需要为此拉入另一个库或直接转到java.lang.Math.floor

当然,这段代码对偶数向量没有任何作用,但我假设你已经可以处理这些了。

【讨论】:

  • 查看 bereal 的回答,在 clojure.core 中加上引号,你不需要地板。
  • 这很狡猾。这家企业有一半知道巨型图书馆里有什么……
  • 另见 bereals 回答你不需要get
猜你喜欢
  • 2014-02-27
  • 1970-01-01
  • 2012-03-06
  • 2016-06-11
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多