* 简单问题:为什么在评估时此函数会抛出异常? *
如果字符串中有重复项,则在找到副本时会抛出类别转换异常。
如果字符串没有重复项,则抛出NullPointerException。
* 代码*
(defn first-duplicate-char [str-in]
(loop [list-Rem (seq str-in) set-Seen (set [])]
(print (type list-Rem) " " list-Rem (next list-Rem) "\n")
(if (= 0 (count str-in))
nil
(if (some #(= (first list-Rem) %) set-Seen)
(first list-Rem)
(recur
(seq (next list-Rem))
(conj set-Seen (first list-Rem)))))))
答案 0 :(得分:2)
您的问题是(= 0 (count str-in))
永远不会更改,因此您最终会尝试在first
上致电nil
。 [编辑:我错了,你的代码实际上是按原样运行的 - if语句只是一个无操作。我希望你无论如何都能享受这个答案的其余部分。]
相反,您应该在next
的{{1}}上致电rest
(而不是list-Rem
)并直接在recur
中使用list-Rem
测试,使用if
的属性为空seq返回nil。以下是我重写代码的方法:
next
的变化:
(defn first-duplicate [in]
(loop [seen #{}
remain (seq in)]
(when-let [[head & tail] remain]
(if (contains? seen head)
head
(recur (conj seen head) tail)))))
或seq
next
rest
(检查是否存在密钥)比contains?
更快(在元素上运行谓词,直到某些东西产生真值)some
在测试失败时返回when
nil
解构并绑定第一个char并休息文体变化: