2024年Clojure问卷调查!中分享您的想法。

欢迎!关于这个平台的工作方式,请参阅关于页面获取更多信息。

+2票数
Clojure
编辑

也许Clojure核心可以考虑一个函数

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

这将有助于那些目前需要编写诸如

(.indexOf something :foo)
的场景,这在持久向量或其他类型实现上需要知道信息,看起来会很糟糕。

index-of函数可以用于clojure.lang.Indexed、java.util.List和java.lang.String实例,并可能通过协议进一步扩展。

我明白index-of在性能方面不是一个理想的函数,但它有其用途。

该函数是否应该被推广为一个返回一个(惰性)序列的索引而不是只返回第一个索引?

1 答案

0票数

clojure.string/index-of已存在,针对字符串的情况。对于集合,过去曾考虑过类似的票据被拒绝(我认为https://clojure.atlassian.net/browse/CLJ-2056是其中一个,但我想可能还有其他)。

使用线性查找(尤其是嵌套线性查找)会导致性能较差

是的,我明白了,但我看到有人使用 `.indexOf` 互操作,这让我有点烦恼,因为这依赖于内部实现。
为了将这个话题略微推广一点——在2010年,一名Clojure的贡献者在Google Group中回复说,

"由于95%的时间.indexOf都用于检查元素是否在一个集合中(如果它是一次性使用,可以使用(some #(= item %) coll)),因此并没有将更合适的数据类型(集合、映射)包含在核心中,以促进更好的适用性。"
我的观点是标准化:我不希望在babashka上支持向量上的 `.indexOf`,因为这暴露了实现细节,所以最好有一个核心函数来处理这个问题,或者确实推荐使用 `some` 方法。
“`some` 方法”会告诉您某个元素是否属于集合,但它不会告诉您索引(在本质上,它是询问谓词对于集合中的某个元素是否返回 true,并相应地返回 true/nil)。但这也不能告诉您某个元素在集合中的位置。我多次希望在核心库中包含覆盖所有有序集合的 `index-of` 函数(任何可以响应 `nth` 的)。我通常用于统计类型的程序,其中我想表示一个给定的数据值表示这样的百分位数。所以,排序集合,查找元素索引,然后将索引除以元素的数量等。是的,它有线性时间上限。但这并没有阻止 `clojure.string/index-of` 有用。是的,对于程序来说,实现二分查找会更好,尤其是针对有序数据。在核心库中也会很有用(仅针对向量化)。
...