Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 按Racket中列表中的元素排序_Sorting_Scheme_Racket - Fatal编程技术网

Sorting 按Racket中列表中的元素排序

Sorting 按Racket中列表中的元素排序,sorting,scheme,racket,Sorting,Scheme,Racket,问题 只是澄清一下:这并不是真正意义上的排序。我得到一个函数(sort sym lst symbol)。函数接受一个(listof(listof symbol))和一个符号,将其转换为一个(list(listof(listof symbol))(list(listof symbol)))。仅仅在这里说明这个问题并没有多大帮助,所以让我们直接进入示例 示例 要一份清单 (define example (list (list 'chocolate 'swe

问题

只是澄清一下:这并不是真正意义上的排序。我得到一个函数
(sort sym lst symbol)
。函数接受一个(listof(listof symbol))和一个符号,将其转换为一个(list(listof(listof symbol))(list(listof symbol)))。仅仅在这里说明这个问题并没有多大帮助,所以让我们直接进入示例

示例

要一份清单

(define example (list 
                     (list 'chocolate 'sweet 'expensive)                          
                     (list 'crocodile 'hostile 'big 'heavy) 
                     (list 'brick 'heavy 'red) 
                     (list 'chocolate 'bitter 'dark)))
如果我输入
(sort sym example'chocolate)
,列表将按以下方式排序:

(list
(list (list 'chocolate 'sweet 'expensive)
      (list 'chocolate 'bitter 'dark))

(list (list 'crocodile 'hostile 'big 'heavy)
      (list 'brick 'heavy 'red)))
如果输入是
(sort-sym-example'鳄鱼)
,那么列表将是

(list
    (list (list 'crocodile 'hostile 'big 'heavy))

    (list (list 'chocolate 'sweet 'expensive)
          (list 'chocolate 'bitter 'dark)
          (list 'brick 'heavy 'red)))
请注意,所有包含“巧克力”一词的列表都放在一个列表中,而所有不包含“巧克力”一词的列表都放在另一个列表中。在这种情况下,顺序并不重要

另外:两个列表之间的空格只是为了让代码更清晰

代码

所以我对这个有点迷茫。但我试过一些方法,例如,我试过使用过滤器

(define (sort-examples lst sym)
  (local [(define (sym-equal? other-sym) (symbol=? other-sym sym))]
    (cond [(empty? lst) empty]
          [else (cons (filter sym-equal? (first lst))
                      (sort-examples (rest lst) sym))])))

但这并没有真正的帮助,因为我试图保留列表,而不是从列表中删除元素。能给我一些关于这个的指导吗?谢谢。

正如评论中所暗示的,在Racket中,使用
分区
内置过程很简单:

(define (sort-sym lst sym)
  (let-values (((match no-match)
                (partition (lambda (sl) (symbol=? (first sl) sym))
                           example)))
    (list match no-match)))
也可以通过执行两个
filter
操作来解决此问题,但效率较低:

(define (sort-sym lst sym)
  (list (filter (lambda (sl) (symbol=? (first sl) sym)) lst)
        (filter (lambda (sl) (not (symbol=? (first sl) sym))) lst)))
对于给定的示例,无论哪种方式,它都能按预期工作:

(define example
  '((chocolate sweet expensive)                          
    (crocodile hostile big heavy) 
    (brick heavy red) 
    (chocolate bitter dark)))

(sort-sym example 'chocolate)
=> '(((chocolate sweet expensive) (chocolate bitter dark))
     ((crocodile hostile big heavy) (brick heavy red)))

(sort-sym example 'crocodile)
=> '(((crocodile hostile big heavy))
     ((chocolate sweet expensive) (chocolate bitter dark) (brick heavy red)))

球拍是否支持SRFI-1?或者写你自己的版本是这个练习的重点吗?我想这个练习的重点是发现如果你把它分成两个问题,“基于谓词划分列表”和“定义谓词”,它会变得多么容易。谢谢你的回答。这真的很有帮助。尽管我被允许使用lambda,但我很想知道除了它之外是否还有其他选择。如果有的话,你能简单地解释一下它是如何工作的吗?好吧,你基本上可以实现你自己版本的
过滤器
:一个程序,它接收列表中的输入,并将满足条件的列表中的元素作为输出返回。一般的想法是,您应该将问题分成几个较小的部分,并编写帮助程序来解决每个部分。