2013-03-05 6 views

उत्तर

7

क्लोजर आसान Java Interop के लिए एक अंतर्निहित तरीका प्रदान करता है।

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

आपके उत्तर के लिए धन्यवाद। अंत में मैं इसका उपयोग करूंगा, लेकिन मैं आमतौर पर 'इंटरफ़ेस' कोड से स्पष्ट रूप से जावा इंटरऑप को कॉल करने से बचने की कोशिश कर रहा हूं, क्योंकि मुझे लगता है कि यह थोड़ा वर्बोज़ है। फिर भी धन्यवाद। –

+0

हालांकि यह काम कर सकता है, ध्यान रखें कि संग्रह एक अनुक्रम नहीं है। – NielsK

+0

@NielsK दार्शनिक विचारों को एक तरफ, मुझे लगता है कि आपको 'java.util.List'' seq' के सुपरक्लास के रूप में मिलेगा और जावा विधि 'java.util.List' की जोड़ी पर है। इस प्रकार, आप आलसी अनुक्रमों पर इसका उपयोग कर सकते हैं (केवल एक अनंत का मूल्यांकन न करने के लिए सावधान रहें) '(java.util.Collections/indexOfSubList (रेंज 10) (रेंज 3 7)); => 3', वैक्टर, क्रमबद्ध- मानचित्र, आदि –

3

एक अनुक्रम एक विवेकाधिकार नहीं है, एक विवेक नहीं है। कुछ विवेकाधिकार जिन्हें आप अनुक्रम अबास्ट्रक्शन के माध्यम से उपयोग कर सकते हैं, बाद में (स्ट्रिंग्स और जावा संग्रह, उदाहरण के लिए) की स्थिति को खोजने का एक तरीका है, लेकिन सामान्य रूप से अनुक्रम नहीं होते हैं, क्योंकि अंतर्निहित विवेकाधिकार में इंडेक्स नहीं होना चाहिए ।

हालांकि आप क्या कर सकते हैं, तत्व पहचान और एक अनुक्रमणिका फ़ंक्शन का एक मिश्रण बनाते हैं। map-indexed पर एक नज़र डालें।

यहां एक निष्पक्ष कार्यान्वयन है जो क्रमशः अनुक्रम में (सभी) की स्थिति को स्थिति में पायेगा। बस पहले का उपयोग करें या 1 लेने के लिए केवल एक ही लगता है:

(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) 

लो परवाह है कि सूचकांक आधारित एल्गोरिदम आम तौर पर कुछ आप एक कार्यात्मक भाषा में करना होगा नहीं हैं। जब तक कि अच्छे नतीजे न हों तो आपको अंतिम परिणाम में इंडेक्स की आवश्यकता नहीं है, इंडेक्स लुकअप का शानदार उपयोग कोड गंध माना जाता है।

संबंधित मुद्दे