最高分

最高分

學習練習

簡介

雜湊表

Common Lisp 中的雜湊表是用來儲存關聯性資料的資料結構。 它們把鍵(可以是任何物件)對應到值(可以是任何物件)。 其他程式語言可能會把這個概念稱為映射、字典或雜湊。

建立雜湊表

雜湊表可以用make-hash-table函式建立。

(make-hash-table) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {10024AD2B3}>

(請注意,雜湊表列印出來的呈現方式取決於實作,所以在你的 REPL 裡可能長得不一樣。)

依鍵取得值

要從雜湊表中依鍵取得值,可以使用gethash函式:

*h* ; => #<HASH-TABLE :TEST EQL :COUNT 3 {10024AD2B3}>`
(gethash :foo *h*) ; => :bar
                   ;    T

gethash會回傳多個值,這會在另一個概念中說明。

插入值

要把值插入雜湊表,可以像這樣把setf和gethash搭配使用:

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

這會把雜湊表*hash-table*中鍵:foo的值改成:bar。 它會回傳這個值。

setf的用法會在另一個概念中說明。

說明

Lamont 是一個 Lisp 外星人,想要寫自己的電動遊戲。他們請你幫忙的其中一項任務,就是記錄高分表。

1. 建立高分表

請定義一個函式make-high-score-table,它不接受任何引數,並且會求值為一個新的空雜湊表:

(make-high-score-table) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {1005A90103}>

2. 把玩家加入表中

要把玩家加入表中,請定義一個函式add-player,它接受兩個引數:

  • 高分表
  • 玩家的名稱,以關鍵字表示

把玩家的初始分數設為零。

(add-player hash-table :louis) ; => 0
(add-player hash-table :lilly) ; => 0

3. 設定玩家的分數

要設定某位玩家的分數,請定義一個函式set-score,它接受三個引數:

  • 高分表
  • 玩家的名稱,以關鍵字表示
  • 玩家的分數,以整數表示
(set-score hash-table :louis 1234) ; => 1234

4. 從表中取得分數

要從表中取得某位玩家的分數,請定義一個函式get-score,它接受兩個引數:

  • 高分表
  • 玩家的名稱,以關鍵字表示

這個函式應該求值為該玩家所儲存的分數。 如果該玩家沒有儲存任何分數,或是該玩家尚未加入表中,則求值為0。

(get-score hash-table :louis)                         ; => 1234
(get-score hash-table :lilly)                         ; => 0
(get-score hash-table :not-a-character-in-this-story) ; => 0

5. 從表中移除玩家

要從高分表中移除玩家,請定義一個函式remove-player,它接受兩個引數:

  • 高分表
  • 玩家的名稱,以關鍵字表示

這個函式應該妥善處理玩家尚未加入表中的情況。 很明顯地,玩家被移除之後,若從表中取得他們的分數,結果會是零。

(set-score hash-table :louis 1234)           ; => 1234
(remove-player hash-table :louis)            ; => T
(get-score hash-table :louis)                ; => 0

(remove-player hash-table :not-in-the-table) ; => NIL
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Common Lisp Exercism

準備好開始 最高分 了嗎?

註冊 Exercism,透過 27 個概念92 個練習 和真人引導來學習並精通 Common Lisp,全部免費。