在Clojure中检查字符串是否以给定字符串结尾

8

我创建了一个函数来检查第一个字符串是否以第二个字符串结尾。

在 Java 中,我们有现成的方法可以检查这一点,但在 Clojure 中,我找不到这样的方法,所以我编写了以下自定义函数:

(defn endWithFun [arg1 arg2] 
    (= (subs arg1 (- (count arg1) (count arg2)) (count arg1)) arg2))

输出:

> (endWithFun "swapnil" "nil")
true
> (endWithFun "swapnil" "nilu")
false

这正如预期的那样工作。

我想知道,是否有类似的替代方案? 在我的情况下,我进行的比较是区分大小写的。我也想忽略大小写敏感性。

2个回答

14

您可以直接在Clojure中访问原生Java的endsWith函数:

(.endsWith "swapnil" "nil")

请查看http://clojure.org/java_interop以获取更多细节。

您可以自然地组合这些来实现不区分大小写:

(.endsWith (clojure.string/lower-case "sWapNIL") "nil")

谢谢,这正是我一直在寻找的。现在我可以看到我可以通过使用(.)来使用String类的Java API,我尝试了(subs "swapbil" 1 4)(. "swapnil" substring 1 4)都给出了答案wap,如果我在Clojure中使用Java,会有任何性能降低吗?还是两者性能相同? - swapy
我认为性能应该是可比的。如果您担心,可以构建一个快速微基准测试。 - Emil Sit
通常情况下,在Clojure中使用Java所遭受的唯一性能损失是在运行时使用反射查找方法,如果对象的类无法在编译时推断出来。clojure.string函数都使用类型提示来避免反射,因此Clojure和Java版本之间应该没有明显的性能差异。 - Alex
感谢 @kotarak 的改进。 - Emil Sit
@EmilSit 不用谢。实际上,新的符号表示法已经被翻译成旧的了。在宏中,旧的符号表示法有时非常有用。但是在源代码中,新的符号表示法看起来更像Clojure。类似的例子:(Constructor. a b c)(new Constructor a b c) - kotarak

6

Clojure 1.8引入了一个ends-with?函数,位于clojure.string中,因此现在有一个本地函数:

> (ends-with? "swapnil" "nil")
true
> (ends-with? "swapnil" "nilu")
false

如果你想不区分大小写,只需应用lower-case


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接