2013-07-30 19 views
8

Ich habe eine Funktion erstellt, um zu überprüfen, ob meine erste Zeichenfolge mit einer zweiten Zeichenfolge endet.Überprüfen, ob die Zeichenfolge mit gegebener Zeichenfolge in clojure endet

In Java haben wir fertige Methode, um dies zu überprüfen, aber in Clojure ist fehlgeschlagen ich ein solches Verfahren zu finden, so geschrieben I benutzerdefinierte Funktion wie folgt:

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

Ausgänge:

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

Diese funktioniert wie erwartet.

Ich möchte wissen, gibt es eine ähnliche Alternative? Auch in meinem Fall, ich vergleiche Fall feinfühlig. Ich möchte auch die Groß-/Kleinschreibung ignorieren.

Antwort

14

Sie können auf die native Java endsWith direkt in Clojure:

(.endsWith "swapnil" "nil") 

Siehe http://clojure.org/java_interop für einige weitere Details.

Anschließend können Sie diese natürlich komponieren Fall Unempfindlichkeit zu bekommen:

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

Danke, das ist, was ich gesucht habe. Jetzt kann ich sehen, dass ich Java API der 'String' Klasse benutzen kann, indem ich' (.) 'benutze, habe versucht' (subs "swapbil" 1 4) 'und' (. "swapnil" substring 1 4) 'beide geben ans * * wap **, wird die Leistung beeinträchtigt, wenn ich Java in clojure verwende? oder beide haben dieselbe Leistung. – swapy

+0

Ich stelle mir vor, dass die Leistung vergleichbar sein sollte. Sie können einen schnellen Mikro-Benchmark erstellen, wenn Sie sich Sorgen machen. –

+0

Im Allgemeinen ist die einzige Leistungseinbuße, die Sie möglicherweise bei der Verwendung von Java in Clojure erleiden, die Verwendung von Reflektion zum Nachschlagen einer Methode zur Laufzeit, wenn die Klasse eines Objekts zur Kompilierungszeit nicht abgeleitet werden kann. Die "clojure.string" -Funktionen verwenden alle Typhinweise, um Reflektionen zu vermeiden, daher sollte der Leistungsunterschied zwischen den Clojure- und Java-Versionen vernachlässigbar sein. – Alex

4

Clojure 1.8 eine ends-with? Funktion in clojure.string eingeführt, es so ist jetzt eine native Funktion:

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

Wieder nur anwenden lower-case, wenn Sie die Groß-/Kleinschreibung nicht berücksichtigen möchten.

Verwandte Themen