المسارات
/
Common Lisp
Common Lisp
/
المنهج
/
جداول التجزئة
جد

جداول التجزئة في Common Lisp

4 تمارين

نبذة عن جداول التجزئة

جداول التجزئة في Common Lisp هي هياكل بيانات لتخزين البيانات الترابطية. وهي تربط المفاتيح (التي يمكن أن تكون أي كائن) بالقيم (التي يمكن أن تكون أي كائن).

إنشاء جداول التجزئة

يمكن إنشاء جداول التجزئة باستخدام الدالة make-hash-table.

تأخذ الدالة make-hash-table عدة معاملات مفتاحية لضبط الحجم الابتدائي لجدول التجزئة وعتبة تغيير حجمه؛ راجع التوثيق للحصول على معلومات كاملة عنها. والأهم من ذلك أنها تأخذ أيضًا معاملًا مفتاحيًا باسم test يحدد كيفية مقارنة المفاتيح أثناء إدراج المفاتيح والقيم والبحث عنها وإزالتها. يمكن أن تكون قيم الوسيط test واحدة من 'eq أو 'eql أو 'equal أو 'equalp، وهي تقابل محمولات التساوي العامة. القيمة الافتراضية هي 'eql.

العمليات الشائعة على جداول التجزئة

للحصول على قيمة بواسطة مفتاحها يُستخدم gethash. تأخذ gethash [وسيطًا اختياريًا][concept-defualt-arguments] يعمل كقيمة تُرجع إذا لم يكن المفتاح موجودًا في جدول التجزئة. تُرجع gethash أيضًا قيمًا متعددة (موضحة في مفهوم آخر). القيمة الأولى هي قيمة ذلك المفتاح في جدول التجزئة، أو القيمة الافتراضية إن وُجدت، أو NIL. القيمة الثانية هي قيمة منطقية تشير إلى ما إذا كان المفتاح موجودًا في جدول التجزئة أم لا.

لإدراج زوج من مفتاح وقيمة يُستخدم setf مع gethash.

لإزالة مفتاح وقيمته استخدم remhash.

لإزالة جميع المفاتيح والقيم استخدم clrhash

مع أن جدول التجزئة في Common Lisp، كما في لغات أخرى، ليس له ترتيب مضمون، فقد يكون من المفيد أحيانًا المرور عليه ومعالجة كل زوج من المفتاح والقيمة. يمكن فعل ذلك باستخدام maphash:

(maphash #'(lambda (key value) (print (cons key value))) *hash-table*)

(سيطبع هذا كل مفتاح وقيمة كزوج cons، واحدًا في كل سطر.)

مرجع

(setf *hash-table* (make-hash-table))     ; => #<HASH-TABLE :TEST EQL :COUNT 0 {100375FD23}>
(gethash :foo *hash-table*)               ; => NIL
                                          ;    NIL
(gethash :foo *hash-table* 
         :default-value)                  ; => :DEFAULT-VALUE
                                          ;    NIL

(setf (gethash :foo *hash-table*) :bar)   ; => :BAR
(gethash :foo *hash-table*)               ; => :BAR
                                          ;    T

(setf (gethash :key *hash-table*) :value) ; => :RIGHT
(gethash :key *hash-table*)               ; => :VALUE
                                          ;    T

(remhash :key *hash-table*)               ; => T
(gethash :key *hash-table*)               ; => NIL
                                          ; => NIL
                            
(clrhash *hash-table*)                    ; => #<HASH-TABLE :TEST EQL :COUNT 0 {1005A90103}>
(gethash :foo *hash-table*)               ; => NIL
                                          ;    NIL
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة

تعلّم جداول التجزئة

التدريب مقفل

افتح 3 تمارين إضافية لممارسة جداول التجزئة