LISP - Karma Tablosu

Karma tablo veri yapısı, aşağıdakilerin bir koleksiyonunu temsil eder: key-and-valueanahtarın karma koduna göre düzenlenen çiftler. Koleksiyondaki öğelere erişmek için anahtarı kullanır.

Bir anahtar kullanarak öğelere erişmeniz gerektiğinde bir karma tablo kullanılır ve kullanışlı bir anahtar değeri tanımlayabilirsiniz. Karma tablosundaki her öğenin bir anahtar / değer çifti vardır. Anahtar, koleksiyondaki öğelere erişmek için kullanılır.

LISP'de Hash Tablosu Oluşturma

Ortak LISP'de, karma tablo genel amaçlı bir koleksiyondur. Keyfi nesneleri anahtar veya dizin olarak kullanabilirsiniz.

Bir hash tablosunda bir değer depoladığınızda, bir anahtar / değer çifti oluşturur ve bu anahtarın altında depolarsınız. Daha sonra aynı anahtarı kullanarak değeri hash tablosundan alabilirsiniz. Bir anahtarda yeni bir değer saklayabilmenize rağmen, her anahtar tek bir değerle eşleşir.

LISP'deki karma tablolar, anahtarların karşılaştırılma şekline bağlı olarak üç türe ayrılabilir - eq, eql veya eşit. Karma tablo LISP nesnelerinde karma hale getirilirse, anahtarlar eq veya eql ile karşılaştırılır. Ağaç yapısında hash tablosu hash ise, eşit kullanılarak karşılaştırılır.

make-hash-tablefonksiyonu, bir karma tablo oluşturmak için kullanılır. Bu işlevin sözdizimi -

make-hash-table &key :test :size :rehash-size :rehash-threshold

Nerede -

  • key argüman anahtarı sağlar.

  • :testbağımsız değişken anahtarların nasıl karşılaştırılacağını belirler - üç değerden birine sahip olmalıdır: # 'eq, #' eql veya # 'eşit veya üç sembolden biri eq, eql veya equ. Belirtilmezse, eql varsayılır.

  • :sizeargüman, karma tablonun başlangıç ​​boyutunu ayarlar. Bu, sıfırdan büyük bir tam sayı olmalıdır.

  • :rehash-sizebağımsız değişken, karma tablo dolduğunda boyutunun ne kadar artırılacağını belirtir. Bu, eklenecek girişlerin sayısı olan sıfırdan büyük bir tamsayı olabilir veya yeni boyutun eski boyuta oranı olan 1'den büyük bir kayan nokta sayısı olabilir. Bu bağımsız değişken için varsayılan değer uygulamaya bağlıdır.

  • :rehash-thresholdargüman, karma tablonun büyümeden önce ne kadar dolu olabileceğini belirtir. Bu, sıfırdan büyük ve şundan küçük bir tamsayı olabilir: rehash-size (bu durumda tablo her büyütüldüğünde ölçeklenir) veya sıfır ile 1 arasında bir kayan nokta sayısı olabilir. Bunun için varsayılan değer argüman uygulamaya bağlıdır.

Ayrıca, hash-table işlevini bağımsız değişken olmadan da çağırabilirsiniz.

Öğeleri Karma Tablosundan Alma ve Karma Tablosuna Ekleme

gethashişlevi, anahtarını arayarak karma tablodan bir öğeyi alır. Anahtarı bulamazsa sıfır döndürür.

Aşağıdaki sözdizimine sahiptir -

gethash key hash-table &optional default

nerede -

  • anahtar: ilişkili anahtardır

  • karma tablo: aranacak karma tablodur

  • default: Girdi bulunmazsa döndürülecek değerdir, belirtilmezse sıfırdır.

gethash işlev aslında iki değer döndürür; ikincisi, bir giriş bulunursa doğru olan ve hiçbir giriş bulunmadıysa yanlış olan bir yüklem değeridir.

Karma tablosuna bir öğe eklemek için, setf ile birlikte işlev gethash işlevi.

Misal

Main.lisp adlı yeni bir kaynak kod dosyası oluşturun ve içine aşağıdaki kodu yazın.

(setq empList (make-hash-table)) 
(setf (gethash '001 empList) '(Charlie Brown))
(setf (gethash '002 empList) '(Freddie Seal)) 
(write (gethash '001 empList)) 
(terpri)
(write (gethash '002 empList))

Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -

(CHARLIE BROWN)
(FREDDIE SEAL)

Bir Girişin Kaldırılması

remhashişlevi, karma tablodaki belirli bir anahtar için herhangi bir girişi kaldırır. Bu, bir giriş varsa doğru olan, yoksa yanlış olan bir yüklemdir.

Bu işlevin sözdizimi -

remhash key hash-table

Misal

Main.lisp adlı yeni bir kaynak kod dosyası oluşturun ve içine aşağıdaki kodu yazın.

(setq empList (make-hash-table)) 
(setf (gethash '001 empList) '(Charlie Brown))
(setf (gethash '002 empList) '(Freddie Seal)) 
(setf (gethash '003 empList) '(Mark Mongoose)) 

(write (gethash '001 empList)) 
(terpri)
(write (gethash '002 empList)) 
(terpri)
(write (gethash '003 empList))  
(remhash '003 empList)
(terpri)
(write (gethash '003 empList))

Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -

(CHARLIE BROWN)
(FREDDIE SEAL)
(MARK MONGOOSE)
NIL

Maphash İşlevi

maphash işlevi, bir karma tablosundaki her bir anahtar / değer çiftine belirli bir işlevi uygulamanıza olanak tanır.

İki argüman alır - fonksiyon ve bir hash tablosu ve hash tablosundaki her anahtar / değer çifti için fonksiyonu bir kez çağırır.

Misal

Main.lisp adlı yeni bir kaynak kod dosyası oluşturun ve içine aşağıdaki kodu yazın.

(setq empList (make-hash-table)) 
(setf (gethash '001 empList) '(Charlie Brown))
(setf (gethash '002 empList) '(Freddie Seal)) 
(setf (gethash '003 empList) '(Mark Mongoose)) 

(maphash #'(lambda (k v) (format t "~a => ~a~%" k v)) empList)

Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -

3 => (MARK MONGOOSE)
2 => (FREDDIE SEAL)
1 => (CHARLIE BROWN)