2013-07-30 108 views
8

我創建了一個函數來檢查我的第一個字符串是否以第二個字符串結尾。檢查字符串是否以clojure中的給定字符串結尾

在Java中,我們有現成的方法來檢查這一點,但Clojure中我沒能找到這樣的方法,所以我編寫的自定義功能如下:

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

輸出:

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

這按預期工作。

我想知道,有沒有類似的選擇? 同樣在我的情況下,我比較區分大小寫。我也想忽略區分大小寫。

回答

14

您可以用Clojure直接訪問本地Java endsWith

(.endsWith "swapnil" "nil") 

一些更多的詳情,請參閱http://clojure.org/java_interop

然後可以自然合成這得到不區分大小寫:

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

謝謝,這就是我一直在尋找的。現在我可以看到我可以通過使用'(。)'使用'String'類的java api,我試過'(subs「swapbil」1 4)'和'(。「swapnil」substring 1 4)'' * wap **,如果我在clojure中使用java,是否有任何性能下降?或者兩者都有相同的表現。 – swapy

+0

我想這個表現應該是可比的。如果你擔心,你可以建立一個快速的微基準。 –

+0

通常,在Clojure中使用Java可能會遭受的唯一性能損失是如果在編譯時不能推斷出對象的類,則使用反射來在運行時查找方法。 'clojure.string'函數都使用類型提示來避免反射,所以Clojure和Java版本之間的性能差異應該可以忽略不計。 – Alex

4

的Clojure 1.8 clojure.string推出了ends-with?功能,所以現在有一個本地函數:

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

同樣,剛剛申請lower-case如果你想不區分大小寫。

相關問題