2011-09-22 11 views
5

अब मैं इसे छँटाई करने से पहले एक सूची hastable नकल करने के लिए है:मूल्य से हैशटेबल को सॉर्ट करने का सबसे अच्छा तरीका क्या है?

(defun good-red() 
    (let ((tab (make-hash-table)) (res '())) 
    (dotimes (i 33) (setf (gethash (+ i 1) tab) 0)) 
    (with-open-file (stream "test.txt") 
     (loop for line = (read-line stream nil) 
      until (null line) 
      do 
       (setq nums (butlast (str2lst (substring line 6)))) 
       (dolist (n nums) (incf (gethash n tab))) 
       )) 
    **(maphash #'(lambda (k v) (push (cons k v) res)) tab)** 
    (setq sort-res (sort res #'< :key #'cdr)) 
    (reverse (nthcdr (- 33 18) (mapcar #'car sort-res))))) 

BTW, एक सूची के पहले एन तत्वों को लाने के लिए बेहतर तरीका क्या है?

+1

आपका प्रश्न क्या है? शीर्षक में से एक, या सामग्री में से एक? –

+0

क्या शीर्षक और/या टिप्पणियों में से किसी एक के जवाब देने के लिए यह अधिक रचनात्मक नहीं होगा? – Paralife

उत्तर

10

Vatine के जवाब तकनीकी रूप से सही है, लेकिन शायद सुपर कोई यह सवाल पूछने का तात्कालिक समस्या के लिए उपयोगी नहीं है। एक हैश तालिका का उपयोग कर काउंटर का एक संग्रह धारण करने के लिए है, तो स्कोर से शीर्ष N आइटम का चयन करने की सामान्य स्थिति इस तरह किया जा सकता है:

;; convert the hash table into an association list 
(defun hash-table-alist (table) 
    "Returns an association list containing the keys and values of hash table TABLE." 
    (let ((alist nil)) 
    (maphash (lambda (k v) 
       (push (cons k v) alist)) 
      table) 
    alist)) 

(defun hash-table-top-n-values (table n) 
    "Returns the top N entries from hash table TABLE. Values are expected to be numeric." 
    (subseq (sort (hash-table-alist table) #'> :key #'cdr) 0 n)) 

पहले समारोह की एक श्रृंखला के रूप में एक हैश तालिका की सामग्री रिटर्न विपक्ष 'एक सूची है, जो एक संघ सूची (कुंजी/मान जोड़े के लिए विशिष्ट सूची प्रतिनिधित्व) कहा जाता है में जोड़े d। अधिकांश लिस्प उत्साही पहले से ही इस समारोह में भिन्नता रखते हैं क्योंकि यह एक आम ऑपरेशन है। यह संस्करण Alexandria लाइब्रेरी से है, जिसका उपयोग सीएल समुदाय में बहुत व्यापक रूप से किया जाता है।

दूसरा समारोह alist पहले समारोह कुंजी के रूप में प्रत्येक जोड़ी की सीडीआर का उपयोग करके लौटे छँटाई द्वारा वापस सूची से पहले एन आइटम हड़पने के लिए subseq उपयोग करता है। बदल रहा है: # 'कार की कुंजी हैश कुंजी द्वारा सॉर्ट करेगी, #'> # # < बदलकर सॉर्ट ऑर्डर को बदल देगा।

2

एक हैश तालिका स्वाभाविक अव्यवस्थित है। यदि आप इसे सॉर्ट करना चाहते हैं, तो आपको सामग्री के साथ किसी प्रकार की ऑर्डर की गई डेटा संरचना शुरू करने की आवश्यकता है।

आप एक दृश्य के पहले एन तत्वों को लाने के लिए चाहते हैं, वहाँ हमेशा subseq है।

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