0

ポイントの座標(X、Y)をリストに保存したい。また、リストにポイントを追加するたびに、リストをX値またはY値で並べ替えたいと思います。

どうやってやるの?

前もって感謝します。

4

1 に答える 1

4

これをSchemeで行う方法はたくさんあります。この回答では、PLTスキームを使用します(タグが提案したとおり)。これらのことについてもっと読むことができるPLT スキームのドキュメントへのリンクを提供します。

まず、ポイント構造を定義できます。

(define-struct point (xy) #:transparent)

この単純な定義により、ポイントを操作するときに使用できる多くの便利な関数が自動的に作成されます

  • (make-point 3 4)座標(3,4)で新しいポイントを作成します
  • (point-x <some-point>)x 座標を返します。(point-x (make-point 3 4))に評価されます3

ポイントのリストをy 座標で並べ替えるには:

(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関数は、次の 2 つのオプションの引数を取ります。

  • リストを異なる順序でソートするために使用できる述語関数 (デフォルトは <)
  • 何らかの構造から要素を抽出するために使用できるキー関数 (デフォルトは ID 関数)

この関数は次のように使用できます。

> (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で、ポイントのソートされたリストです。

于 2009-06-11T11:21:47.937 に答える