我是个新来的,我想定义一个函数。sort-mail
这是要排序的哈希表。
我已经定义了一些列表。
(define test-dates
'("Sun, 10 Sep 2017 09:48:44 +0200"
"Wed, 13 Sep 2017 17:51:05 +0000"
"Sun, 10 Sep 2017 13:16:19 +0200"
"Tue, 17 Nov 2009 18:21:38 -0500"
"Wed, 13 Sep 2017 10:40:47 -0700"
"Thu, 14 Sep 2017 12:03:35 -0700"
"Wed, 18 Nov 2009 02:22:12 -0800"
"Sat, 09 Sep 2017 13:40:18 -0700"
"Tue, 26 Oct 2010 15:11:06 +0200"
"Tue, 17 Nov 2009 18:04:31 -0800"
"Mon, 17 Oct 2011 04:15:12 +0000"
"Sun, 16 Oct 2011 23:12:02 -0500"
"Mon, 11 Sep 2017 14:41:12 +0100"))
(define sorted-dates
'("Tue, 17 Nov 2009 18:04:31 -0800"
"Tue, 17 Nov 2009 18:21:38 -0500"
"Wed, 18 Nov 2009 02:22:12 -0800"
"Tue, 26 Oct 2010 15:11:06 +0200"
"Sun, 16 Oct 2011 23:12:02 -0500"
"Mon, 17 Oct 2011 04:15:12 +0000"
"Sat, 09 Sep 2017 13:40:18 -0700"
"Sun, 10 Sep 2017 09:48:44 +0200"
"Sun, 10 Sep 2017 13:16:19 +0200"
"Mon, 11 Sep 2017 14:41:12 +0100"
"Wed, 13 Sep 2017 10:40:47 -0700"
"Wed, 13 Sep 2017 17:51:05 +0000"
"Thu, 14 Sep 2017 12:03:35 -0700"))
这个函数应该能通过这个测试
(module+ test
(define test-hashes (map (lambda (x) (hasheq 'Date x)) test-dates))
(define sorted-hashes (map (lambda (x) (hasheq 'Date x)) sorted-dates))
(check-equal? (sort-mail test-hashes) sorted-hashes))
那我该怎么开始呢?我发现在Racket中处理哈希表非常困难。我想过用 sort
函数,但我猜它不接受一个哈希表作为参数。
哈希表本质上是排序的。通过设计,它们通过将唯一的键映射到索引,允许(理论上)即时查找时间。所以,没有排序机制来作用于哈希表,因为没有必要。如果你想将键值对汇总到一个列表中,然后进行排序,那当然是可以的。
hash-keys 将返回表中键的列表。 hash-values 将返回表中值的列表。
这些列表可以进行排序。你也可以将每个列表中的每个元素配对在一起,(所以是一个键值对的列表)。试试下面的方法。
(define h (make-immutable-hash
(list (cons 1 2)
(cons 3 4)
(cons 5 6)
(cons 7 8))))
(define (pair-up key value)
(list key value))
(map pair-up (hash-keys h) (hash-values h))
; Alternative to above, where pair-up is essentially defined inside.
(map (lambda (key value) (list key value)) (hash-keys h) (hash-values h))