2011-09-22 13 views
5

teraz muszę skopiować hastable do listy przed sortowaniem go:Jaki jest najlepszy sposób sortowania hashtable według wartości?

(defun good-red() 
    (let ((tab (make-hash-table)) (res '())) 
    (dotimes (i 33) (setf (gethash (+ i 1) tab) 0)) 
    (with-open-file (stream "test.txt") 
     (loop for line = (read-line stream nil) 
      until (null line) 
      do 
       (setq nums (butlast (str2lst (substring line 6)))) 
       (dolist (n nums) (incf (gethash n tab))) 
       )) 
    **(maphash #'(lambda (k v) (push (cons k v) res)) tab)** 
    (setq sort-res (sort res #'< :key #'cdr)) 
    (reverse (nthcdr (- 33 18) (mapcar #'car sort-res))))) 

BTW, jaki jest lepszy sposób, aby sprowadzić pierwszych elementów n listy?

+1

Jakie jest twoje pytanie? Ten w tytule lub ten w treści? –

+0

Czy nie byłoby bardziej konstruktywne po prostu odpowiedzieć na pytanie w tytule i/lub w komentarzu? – Paralife

Odpowiedz

10

Odpowiedź Vatine jest poprawna pod względem technicznym, ale prawdopodobnie nie jest zbyt pomocna w przypadku bezpośredniego problemu osoby zadającej to pytanie. Wspólna sprawa korzystania z tabeli mieszania trzymać kolekcję liczników, a następnie wybierając z góry N elementów Wyniku można zrobić tak:

;; 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)) 

Pierwsza funkcja zwraca zawartość tabeli mieszania jako seria cons 'd pary na liście, która jest nazywana listą powiązań (typowa reprezentacja list dla par klucz/wartość). Większość entuzjastów Lisp ma już odmiany tej funkcji, ponieważ jest to tak powszechna operacja. Ta wersja pochodzi z biblioteki Alexandria, która jest bardzo szeroko stosowana w społeczności CL.

Druga funkcja używa SUBSEQ do pobrania pierwszych N pozycji z listy zwróconych przez sortowanie alisty zwróconego przez pierwszą funkcję przy użyciu CDR każdej pary jako klucza. Zmiana: klucz do # 'samochód będzie sortował według kluczy hash, zmieniająC#'> na # '< odwróci kolejność sortowania.

2

Hashman jest z natury nieuporządkowany. Jeśli chcesz to posortować, musisz zainicjować uporządkowaną strukturę danych wraz z zawartością.

Jeśli chcesz pobrać pierwsze N ​​elementów sekwencji, zawsze jest SUBSEQ.