【问题标题】:Scheme: How to delete/remove element from a vector方案:如何从向量中删除/移除元素
【发布时间】:2012-11-14 22:11:28
【问题描述】:

我正在为 Gimp script-fu 启动方案,但我找不到从向量中删除项目的简单方法。

我唯一的解决办法是:

  1. 将向量转换为列表
  2. 从列表中删除项目 (http://stackoverflow.com/questions/1905222/how-to-delete-an-element-from-a-list-in-scheme)
  3. 将列表转换为矢量

这是一种更简单的方法吗?

这是我的代码:

(set! myvector (list->vector (delete item (vector->list myvector))))

(define delete
  (lambda (item list)
    (cond
     ((equal? item (car list)) (cdr list))
     (else (cons (car list) (delete item (cdr list)))))))

【问题讨论】:

    标签: vector scheme gimp script-fu


    【解决方案1】:

    或者通过更直观的方式:

    (define (vector-delete v i)
      (vector-append (vector-take v i) (vector-drop v (+ i 1)))) 
    

    【讨论】:

      【解决方案2】:

      就是这样:您需要创建一个没有需要删除的元素的新向量,并复制所有其他元素。但是在您的代码中,您错过了元素 not 存在于向量中的情况,您也不需要创建中间列表,直接从一个向量转到另一个向量。我使用标准 Scheme 使用 Racket 编写了这个,它应该很容易适应 script-fu:

      (define (vector-delete vec elt)
        (let ((new-vec (if (> (vector-length vec) 0)
                           (make-vector (- (vector-length vec) 1))
                           (vector))))
          (define (loop i j)
            (cond ((= i (vector-length vec))
                   new-vec)
                  ((equal? (vector-ref vec i) elt)
                   (loop (+ i 1) j))
                  ((< j (vector-length new-vec))
                   (vector-set! new-vec j (vector-ref vec i))
                   (loop (+ i 1) (+ j 1)))
                  (else vec)))
          (loop 0 0)))
      

      像这样使用它:

      (define myvector #(1 2 3))
      (set! myvector (vector-delete myvector 3))
      myvector
      => '#(1 2)
      

      【讨论】:

      • 好的,所以我每次都要重新创建一个全新的向量......为什么不呢。感谢您的代码,无需在 Gimp 中修改即可完美运行 :-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-05
      • 2020-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多