【问题标题】:Clojure length of sequenceClojure 序列长度
【发布时间】:2012-01-27 18:48:52
【问题描述】:

我可以发誓我以前有 alength 工作,但我不太清楚我现在做错了什么:

user=> (alength '(1 2 3))
IllegalArgumentException No matching method found: alength  clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:79)
user=> (alength [1 2 3])
IllegalArgumentException No matching method found: alength  clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:79)
user=> (doc alength)
-------------------------
clojure.core/alength
([array])
  Returns the length of the Java array. Works on arrays of all
  types.
nil

我应该怎么做才能在 Clojure 中获取列表/数组的长度?

【问题讨论】:

    标签: clojure functional-programming


    【解决方案1】:

    尝试使用count

    (count '(1 2 3))
    => 3
    (count [1 2 3])
    => 3
    

    【讨论】:

      【解决方案2】:

      正如文档字符串所说,alength 适用于 Java™ 数组,例如 String[]Integer[],这绝对是与 Clojure 列表或向量不兼容的类型,您希望对其使用 count

      user=> (def x '(1 2 3))
      #'user/x
      user=> (def xa (to-array x))
      #'user/xa
      user=> (class x)
      clojure.lang.PersistentList
      user=> (class xa)
      [Ljava.lang.Object;
      user=> (alength xa)
      3
      user=> (alength x) 
      java.lang.IllegalArgumentException: No matching method found: alength (NO_SOURCE_FILE:0)
      user=> (count x)
      3
      

      [Ljava.lang.Object;toStringdefined 输出原生 Object 数组的奇怪方式。

      【讨论】:

      • 请注意,count 也适用于数组。 alength 仅在您已经知道您有一个数组并且需要直接访问的速度关键代码中才需要。 count 在这里会慢一些,因为它更通用。
      【解决方案3】:

      应该是count

      user=> (count '(1 2 3))
      3
      

      【讨论】:

        【解决方案4】:

        这可能有点矫枉过正,但你可以像这样模仿 Common LISP 的长度函数:

        (def length 
         (fn [lst]
          (loop [i lst cnt 0]
           (cond (empty? i) cnt
             :t (recur (rest i)(inc cnt))))))
        

        【讨论】:

          【解决方案5】:

          您可以使用递归方式来做到这一点:

          (defn length
           [list]
           (if (empty? list) 0
            (+ 1 (length (rest list)))))
          

          希望对您有所帮助!

          【讨论】:

            猜你喜欢
            • 2018-12-08
            • 1970-01-01
            • 2018-10-10
            • 2017-10-18
            • 2020-04-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多