请在2024年Clojure状态调查中分享您的想法!

欢迎!请查看关于页面了解如何使用本站。

+2
Clojure
编辑

Clojure核心可能会考虑一个函数

(defn index-of [coll elt] ...)

这可以在您现在不得不编写的情况下有所帮助

(.indexOf something :foo)
这很糟糕,因为它需要您了解例如PersistentVectors或其他类型的实现。

index-of函数可以对clojure.lang.Indexedjava.util.Listjava.lang.String实例起作用,并且可以通过协议进一步扩展。

我明白index-of不一定是性能方面理想的函数,但它有自己的使用场景。

这个函数应该被推广成一个返回一个(懒)索引序列的函数,而不是仅返回第一个索引吗?

1 答案

0

clojure.string/index-of已存在用于字符串情况。对于集合,过去曾经考虑过类似的票据并被拒绝(https://clojure.atlassian.net/browse/CLJ-2056是我想起的那个,但我想也许还有其他的)。

> 线性搜索(尤其是嵌套线性搜索)会导致性能不佳

是的,我明白这一点,但我看到有人使用 `.indexOf` 互操作,这让我有点困扰,因为这个依赖于内部实现。
要将稍微不同的一面带入这个话题--回想起2010年,在Google Group中,一位Clojure贡献者回复说:

“之所以不在核心中推广更合适的(集合、映射)数据类型,是因为95%的时间里,.indexOf用于检查元素是否在集合中(如果仅一次,可以使用(some #(= item %) coll))。”
我的观点是标准化:我不喜欢在babashka上支持`.indexOf`矢量,因为这会暴露实现细节,因此很希望有一个核心函数来处理这个问题,或者推荐使用`some`方法。
“某种方法”可以告诉您某物是否属于集合中,但它不能告诉您索引(实际上,它是在询问谓词是否对集合中的某个元素返回true,并相应地返回true/nil)。但这并不能告诉您某物在集合中的位置。有好几次我希望在核心库中有一个`index-of`函数,涵盖所有顺序集合(任何可以响应`nth`方法的)。我通常在统计类型的行为中使用它,其中我希望表明给定的数据值代表这样的百分位数。所以,对集合进行排序,找到元素索引,然后将索引除以元素数量等。是的,它有线性时间复杂度。但这并没有阻止`clojure.string/index-of`的有用性。是的,对于程序实现二分查找更好,特别是对于有序数据。在核心库中也不失为一个有用的功能(仅指向量)。
...