Domanda

Voglio salvare coordinate dei punti (X, Y) in un elenco. Anche io voglio ordinare l'elenco per X o Y valore ogni volta aggiungo punti in quella lista.

Come posso fare questo?

Grazie in anticipo.

È stato utile?

Soluzione

Ci sono molti modi si può fare questo in Scheme. In questa risposta userò PLT Scheme (come il tag suggerito). Darò collegamenti al PLT Scheme documentazione dove si può leggere di più su queste cose.

Prima di tutto il possibile definire una struttura punto .

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

Questa semplice definizione creerà automaticamente molte funzioni utili che possiamo usare quando si lavora con i nostri punti

  • (make-point 3 4) creerà un nuovo punto di coordinate (3,4)
  • (point-x <some-point>) ritorna coordinata X, es. (point-x (make-point 3 4)) restituisce 3

sort un elenco di punti da loro y coordinate:

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

Se si desidera mantenere l'elenco ordinato quando si insert un nuovo punto si può fare qualcosa di simile

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

La funzione insert prende due argomenti opzionali:

  • una funzione predicato, che può essere utilizzato per mantenere la lista ordinata secondo diversi ordinamenti (il default è <)
  • una funzione chiave che può essere utilizzato per estrarre un elemento da qualche struttura (il default è la funzione identità)

Questa funzione può essere utilizzata in questo modo:

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

dove plist è un elenco ordinato di punti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top