Ответ Ватина технически верен, но, вероятно, не очень полезен для непосредственной проблемы, когда кто-то задает этот вопрос. Распространенный случай использования хеш-таблицы для хранения коллекции счетчиков, а затем выбора первых 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))
Первая функция возвращает содержимое хеш-таблицы в виде серии пар cons в списке, который называется списком ассоциаций (типичное представление списка для пар ключ / значение). Большинство энтузиастов Лиспа уже имеют вариант этой функции под рукой, потому что это такая обычная операция. Эта версия взята из библиотеки Александрия , которая очень широко используется в сообществе CL.
Вторая функция использует SUBSEQ для извлечения первых N элементов из списка, возвращенного путем сортировки списка, возвращенного первой функцией, используя CDR каждой пары в качестве ключа. Изменение: ключ к # 'машина сортирует по хеш-ключам, изменение #'> на # '<инвертирует порядок сортировки. </p>