2013-07-30 11 views
8

私は最初の文字列が2番目の文字列で終わるかどうかをチェックする関数を作成しました。 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を参照してください。

あなたはその後、自然にケース非感受性を取得するために、これを構成することができます:ちょうど適用、再び

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

:今ネイティブ関数があり、

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

ありがとう、これは私が探していたものです。私は '(.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.stringends-with?機能を導入大文字小文字の区別をしたくない場合はlower-case

関連する問題