2011-01-05 32 views
7

मैं लिस्प में नौसिखिया हूं और मैं लिस्प प्रोग्रामिंग सीखना चाहता हूं। मैं निम्नलिखित रूप में कुछ एक पाठ फ़ाइल से पढ़ने सूचियों, की तरह क्रमबद्ध करना चाहते हैं:कुछ तत्वों के अनुसार सॉर्टिंग सूचियां

(a 120 135 124 124) 
(b 120 135 124 124) 
(c 120 135 124 124) 

पहले पूर्णांक तत्व को या हो सकता है दूसरे या तीसरे और इतने पर अनुसार उन्हें सॉर्ट करने के लिए सबसे अच्छा तरीका क्या है?

  1. उन सब को पढ़ सकते हैं और उन्हें सूचियों
  2. पुनरावृति कंटेनर सूची पर की एक सूची में डाल दिया और बुलबुला तरह तरह पालन नहीं सूची के मूल्यों की तुलना:

    मैं निम्नलिखित विचार है।

क्या यह हासिल करने के लिए और अधिक उपयुक्त डेटा संरचनाएं हैं, शायद जावा में संग्रह की तरह, जो तुलनात्मक ऑब्जेक्ट्स लेते हैं जिनमें सॉर्ट लॉजिक और फुलफिल सॉर्टिंग स्वचालित रूप से होती है?

बहुत बहुत धन्यवाद।

उत्तर

10

मानक sort फ़ंक्शन :key तर्क लेता है जिसका उपयोग ऑब्जेक्ट से किसी प्रकार को सॉर्ट कुंजी के रूप में उपयोग करने के लिए किया जा सकता है। आपके उदाहरण के लिए, यदि आप एक सूची में फ़ाइल से प्रत्येक सूची था objects कहा जाता है, निम्नलिखित विध्वंस तरह objects पहले पूर्णांक तत्व द्वारा और एक क्रमबद्ध सूची वापसी होगी:

(sort objects #'< :key #'second) 

आम की सटीक विनिर्देश के लिए http://l1sp.org/cl/sort देखें लिस्प का sort फ़ंक्शन।

1
(defun position-of-first-int (alist) 
    (position (find-if 
      #'(lambda (x) (not (numberp x))) 
      alist) 
      alist)) 

(defun sort-from-first-int (alist) 
    (sort (subseq alist (1+ (position-of-first-int alist))) #'<)) 

टेस्ट:

> (setf a '(a 120 135 124 124)) 
> (setf b '(120 b 135 124 124)) 
> (setf c '(120 135 c 124 110)) 

> (format t "~a~%" (sort-from-first-int a)) 
(120 124 124 135) 
> (format t "~a~%" (sort-from-first-int b)) 
(124 124 135) 
> (format t "~a~%" (sort-from-first-int c)) 
(110 124) 
संबंधित मुद्दे