2013-07-30 15 views
8

Ho creato una funzione per verificare se la prima stringa termina con una seconda stringa.Verifica se la stringa termina con una stringa data in clojure

In Java abbiamo metodo già pronto a controllare questo, ma in Clojure non sono riuscito a trovare un metodo di funzione personalizzata così ho scritto come segue:

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

Uscite:

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

Questo sta funzionando come previsto.

Voglio sapere, c'è un'alternativa simile? Anche nel mio caso, paragono caso con attenzione. Voglio anche ignorare la distinzione tra maiuscole e minuscole.

risposta

14

È possibile accedere al nativo di Java endsWith direttamente in Clojure:

(.endsWith "swapnil" "nil") 

Vedi http://clojure.org/java_interop per qualche dettaglio in più.

È quindi possibile comporre naturalmente questo per ottenere tra maiuscole e minuscole:

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

Grazie, questo è quello che stavo cercando. ora posso vedere che posso usare java api della classe 'String' usando' (.) ', ho provato' (subs "swapbil" 1 4) 'e' (. "swapnil" sottostringa 1 4) 'entrambi danno ans * * wap **, c'è qualche degrado delle prestazioni se utilizzo java in clojure? o entrambi avranno le stesse prestazioni. – swapy

+0

Immagino che le prestazioni dovrebbero essere comparabili. Puoi costruire un rapido micro-benchmark se sei preoccupato. –

+0

In generale, l'unica penalità legata alle prestazioni che potresti subire utilizzando Java in Clojure è l'uso della reflection per cercare un metodo in fase di esecuzione se la classe di un oggetto non può essere dedotta in fase di compilazione. Le funzioni 'clojure.string' usano tutti i tipi di suggerimenti per evitare riflessioni, quindi ci dovrebbe essere una differenza di prestazioni trascurabile tra le versioni Clojure e Java. – Alex

4

Clojure 1.8 ha introdotto una funzione ends-with? in clojure.string, quindi ora c'è una funzione nativa:

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

Anche in questo caso, applicare solo lower-case se si desidera la mancanza di distinzione tra maiuscole e minuscole.

Problemi correlati