common-lisp
हैश टेबल
खोज…
हैश टेबल बनाना
हैश टेबल make-hash-table
द्वारा बनाए गए make-hash-table
:
(defvar *my-table* (make-hash-table))
परिणामी हैश तालिका के व्यवहार को आगे बढ़ाने के लिए फ़ंक्शन कीवर्ड पैरामीटर ले सकता है:
-
test
: समानता के लिए कुंजियों की तुलना करने के लिए उपयोग किए जाने वाले फ़ंक्शन का चयन करता है। हो सकता है कि कार्यों में से एक के लिए एक डेसिग्नेटरeq
,eql
,equal
याequalp
। डिफ़ॉल्टeq
। -
size
: अंतरिक्ष के बारे में कार्यान्वयन के लिए एक संकेत जो शुरू में आवश्यक हो सकता है। -
rehash-size
: यदि एक पूर्णांक (> = 1) है, तो एक rehash करते समय, हैश तालिका निर्दिष्ट संख्या से अपनी क्षमता बढ़ाएगी। यदि अन्यथा एक फ्लोट (> 1.0) है, तो हैश टेबल अपनी क्षमता कोrehash-size
और पिछले क्षमता के उत्पाद तक बढ़ा देगा। -
rehash-threshold
: निर्दिष्ट करता है कि रेहश को ट्रिगर करने के लिए हैश टेबल को पूरा कैसे करना है।
मैपश के साथ हैश टेबल की प्रविष्टियों पर इरेटिंग
(defun print-entry (key value)
(format t "~A => ~A~%" key value))
(maphash #'print-entry *my-table*) ;; => NIL
maphash
का उपयोग करके एक हैश तालिका की प्रविष्टियों पर पुनरावृति करने की अनुमति देता है। पुनरावृत्ति का क्रम अनिर्दिष्ट है। पहला तर्क दो मापदंडों को स्वीकार करने वाला एक फ़ंक्शन है: वर्तमान प्रविष्टि की कुंजी और मूल्य।
maphash
हमेशा रिटर्न NIL
।
लूप के साथ हैश टेबल की प्रविष्टियों पर इरेटिंग
लूप मैक्रो एक हैश तालिका की कुंजियों, मानों या कुंजियों और मूल्यों पर पुनरावृत्ति का समर्थन करता है। निम्नलिखित उदाहरण संभावनाएं दिखाते हैं, लेकिन पूर्ण लूप सिंटैक्स अधिक संयोजनों और वेरिएंट की अनुमति देता है।
कुंजी और मूल्यों पर
(let ((ht (make-hash-table)))
(setf (gethash 'a ht) 1
(gethash 'b ht) 2)
(loop for k being each hash-key of ht
using (hash-value v)
collect (cons k v)))
;;=> ((A . 1) (B . 2))
(let ((ht (make-hash-table)))
(setf (gethash 'a ht) 1
(gethash 'b ht) 2)
(loop for v being each hash-value of ht
using (hash-key k)
collect (cons k v)))
;;=> ((A . 1) (B . 2))
ओवर कीज़
(let ((ht (make-hash-table)))
(setf (gethash 'a ht) 1
(gethash 'b ht) 2)
(loop for k being each hash-key of ht
collect k))
;;=> (A B)
मूल्यों से अधिक
(let ((ht (make-hash-table)))
(setf (gethash 'a ht) 1
(gethash 'b ht) 2)
(loop for v being each hash-value of ht
collect v))
;;=> (1 2)
एक हैश तालिका पुनरावृत्ति के साथ एक हैश तालिका की प्रविष्टियों पर फेरबदल
हैश तालिका की कुंजियों और मूल्यों को हैश-टेबल-इट्रेटर के साथ मैक्रो का उपयोग करके पुनरावृत्त किया जा सकता है । यह मैपश या लूप की तुलना में थोड़ा अधिक जटिल हो सकता है, लेकिन इसका उपयोग उन तरीकों में उपयोग किए जाने वाले पुनरावृत्ति निर्माण को लागू करने के लिए किया जा सकता है। with-hash-table-iterator एक नाम और एक हैश टेबल लेता है और एक बॉडी के भीतर नाम को बांधता है जैसे कि क्रमिक कॉल नाम से कई मान उत्पन्न करता है: (i) एक बूलियन यह दर्शाता है कि क्या कोई मूल्य मौजूद है; (ii) प्रविष्टि की कुंजी; और (iii) प्रविष्टि का मूल्य।
(let ((ht (make-hash-table)))
(setf (gethash 'a ht) 1
(gethash 'b ht) 2)
(with-hash-table-iterator (iterator ht)
(print (multiple-value-list (iterator)))
(print (multiple-value-list (iterator)))
(print (multiple-value-list (iterator)))))
;; (T A 1)
;; (T B 2)
;; (NIL)