2013-07-30 36 views
8

Tôi đã tạo một hàm để kiểm tra xem chuỗi đầu tiên của tôi có kết thúc bằng chuỗi thứ hai hay không.Kiểm tra xem chuỗi có kết thúc bằng chuỗi đã cho trong clojure

Trong Java chúng ta có sẵn sàng phương pháp thực hiện để kiểm tra điều này, nhưng trong Clojure Tôi thất bại trong việc tìm ra một phương pháp như vậy nên tôi viết chức năng tùy chỉnh như sau:

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

Đầu ra:

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

này đang hoạt động như mong đợi.

Tôi muốn biết, có cách nào khác không? Cũng trong trường hợp của tôi, tôi so sánh trường hợp một cách nhạy cảm. Tôi cũng muốn bỏ qua trường hợp nhạy cảm.

Trả lời

14

Bạn có thể truy cập vào bản Java endsWith trực tiếp trong Clojure:

(.endsWith "swapnil" "nil") 

Xem http://clojure.org/java_interop cho một số chi tiết.

Bạn có thể sau đó tự nhiên soạn này để có được trường hợp vô hồn:

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

Cảm ơn bạn, đây là những gì tôi đang tìm kiếm. bây giờ tôi có thể thấy tôi có thể sử dụng java api của 'String' lớp bằng cách sử dụng' (.) ', tôi đã cố gắng' (subs "swapbil" 1 4) 'và' (. "swapnil" substring 1 4) 'cả hai cung cấp cho ans * * wap **, có bất kỳ hiệu suất làm suy giảm nếu tôi sử dụng java trong clojure? hoặc cả hai sẽ có cùng hiệu suất. – swapy

+0

Tôi tưởng tượng rằng hiệu suất nên được so sánh. Bạn có thể xây dựng một tiêu chuẩn vi mô nhanh chóng nếu bạn lo lắng. –

+0

Nói chung, hình phạt hiệu suất duy nhất bạn có thể gặp phải khi sử dụng Java trong Clojure là sử dụng sự phản chiếu để tìm kiếm một phương thức trong thời gian chạy nếu lớp của đối tượng không thể suy ra tại thời gian biên dịch. Các hàm 'clojure.string' đều sử dụng các gợi ý kiểu để tránh sự phản chiếu, do đó sẽ có sự khác biệt về hiệu suất không đáng kể giữa các phiên bản Clojure và Java. – Alex

4

Clojure 1.8 giới thiệu một chức năng ends-with? trong clojure.string, vì vậy bây giờ có một chức năng có nguồn gốc:

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

Một lần nữa, chỉ cần áp dụng lower-case nếu bạn muốn không phân biệt chữ hoa chữ thường.

Các vấn đề liên quan