2013-03-05 39 views

Trả lời

7

Clojure cung cấp cách tích hợp để dễ dàng Java Interop.

(java.util.Collections/indexOfSubList '(a b c 5 6 :foo g h) '(5 6 :foo)) 
;=> 3 
+0

Cảm ơn câu trả lời của bạn. Đó là những gì tôi sẽ sử dụng cuối cùng, nhưng tôi thường cố gắng tránh gọi Java Interop một cách rõ ràng từ mã 'kinh doanh', vì tôi thấy nó có một chút tiết. Cảm ơn bạn. –

+0

Trong khi thao tác này có thể hoạt động, hãy lưu ý rằng một bộ sưu tập không phải là một chuỗi. – NielsK

+0

@NielsK Các khái niệm triết học sang một bên, tôi nghĩ bạn sẽ tìm thấy 'java.util.List' như là một siêu lớp của' seq' và phương thức java nằm trên cặp 'java.util.List'. Như vậy, bạn có thể sử dụng điều này trên các trình tự lười biếng (chỉ cần cẩn thận để không đánh giá một chuỗi vô hạn) '(java.util.Collections/indexOfSubList (khoảng 10) (khoảng 3 7)); => 3', vectơ, được sắp xếp- bản đồ, v.v. –

3

Trình tự là trừu tượng, không phải là sự kết hợp. Một số concretions mà bạn có thể sử dụng thông qua việc trừu tượng chuỗi có một cách để tìm vị trí của một chuỗi (ví dụ như các chuỗi và các bộ sưu tập java), nhưng các trình tự nói chung thì không, bởi vì concretion cơ bản không cần phải có chỉ mục .

Tuy nhiên, những gì bạn có thể làm là tạo ra một juxt của nhận dạng phần tử và chức năng chỉ mục. Hãy xem map-indexed.

Đây là một triển khai ngây thơ sẽ lười biếng tìm vị trí của (tất cả) (các) chuỗi trong một chuỗi. Chỉ cần sử dụng đầu tiên hoặc lấy 1 để chỉ tìm một:

(defn find-pos 
    [sq sub] 
    (->> 
    (partition (count sub) 1 sq) 
    (map-indexed vector) 
    (filter #(= (second %) sub)) 
    (map first))) 

=> (find-pos [:a :b \c 5 6 :foo \g :h] 
       [\c 5 6 :foo]) 
(2) 

=> (find-pos "the quick brown fox" 
       (seq "quick")) 
(4) 

Hãy quan tâm đến thuật toán dựa trên chỉ mục nói chung không phải là ngôn ngữ chức năng. Trừ khi có lý do chính đáng bạn cần chỉ mục trong kết quả cuối cùng, việc sử dụng tra cứu chỉ mục xa hoa được coi là mã nguồn.

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