如何在方案中保存和排序坐标(点)?

时间:2009-06-11 09:44:48

标签: scheme racket

我想在列表中保存点(X,Y)的坐标。此外,我想每次在该列表中添加点时按X或Y值对列表进行排序。

我该怎么做?

提前致谢。

1 个答案:

答案 0 :(得分:4)

您可以通过多种方式在Scheme中执行此操作。在这个答案中,我将使用PLT Scheme(如您的标签所示)。我将链接到PLT计划documentation,您可以在其中阅读有关这些内容的更多信息。

首先,我们可以define a point structure

 (define-struct point (x y) #:transparent)

这个简单的定义将自动创建许多有用的功能,我们可以在使用我们的点

时使用它
  • (make-point 3 4)将创建一个坐标为(3,4)
  • 的新点
  • (point-x <some-point>)返回x坐标,例如。 (point-x (make-point 3 4))评估为3

按{y}坐标到sort点列表:

(define (sort-by-y lst)
  (sort lst
        <
        #:key point-y))

如果您希望在insert新点时对列表进行排序,则可以执行类似

的操作
(define (insert x xs #:predicate (p <) #:key (k (lambda (x) x)))
   (if (null? xs)
       (list x)
       (let ((y (car xs)))
         (if (p (k x) (k y))
             (cons x xs)
             (cons y (insert x 
                             (cdr xs) 
                             #:predicate p 
                             #:key k))))))

insert函数有两个可选参数:

  • 谓词函数,可用于保持列表按照不同的顺序排序(默认为&lt;)
  • 一个关键函数,可用于从某个结构中提取元素(默认为标识函数)

此功能可以这样使用:

> (insert 3 (list 1 2 4 5 6))
(1 2 3 4 5 6)

> (insert (make-point 3 5) plist #:key point-y)
(#(struct:point 2 1) 
 #(struct:point 9 2) 
 #(struct:point 1 3) 
 #(struct:point 3 5) 
 #(struct:point 6 6))

> (insert (make-point 3 5) (reverse plist) #:predicate > #:key point-y)
(#(struct:point 6 6) 
 #(struct:point 3 5) 
 #(struct:point 1 3) 
 #(struct:point 9 2) 
 #(struct:point 2 1))

其中plist是一个有序的点列表。