2017-10-26 19 views
0

'(3 3 3 1 1 2)などのアイテムのリストを受け入れ、各アイテムの出現を連続した順序で返す関数を構築するのに役立つ必要があります。この特定のリストは'(2 1 3)を返します。私はこれを1つのループで行いたいと思います。Autolispのリストアイテム数

これまでのところ、カウントする各アイテムの位置を含むリストを作成しています。私はそれをやった。だから私はこのようなリストを持っています:'(0 0 0)と私は私が受け取るリスト内の各要素の数を反映するためにこのリストを変更する必要があります。私はこれについてどうやって行くのか分かりません。助言がありますか?

答えて

0

これを試してみてください。

(defun SortByOccurance (ListOfItems/*error* x item pairs sorted) 
    (defun *error* (msg /) 
     (if (not (null msg)) (progn (princ "\nSortByOccurance:*error*: ") (princ msg) (princ "\n"))) 
    ) 
    (foreach x ListOfItems 
     (setq item (assoc x pairs)) 
     (setq pairs (if (null item) 
        (append pairs (list (cons x 1))) 
        (subst (cons (car item) (1+ (cdr item))) item pairs) 
     )) 
    ) 
    (setq sorted (vl-sort pairs (function (lambda (x y) (< (cdr x) (cdr y)))))) 
    (setq sorted (mapcar 'car sorted)) 
    sorted 
) 

(SortByOccurance (list 3 3 3 1 1 2)) 
+0

繰り返しAPPENDは、より良い回避、次の動作です。代わりに、リストの上に落ち着かせてください。とにかく後でそれを並べ替えるつもりです –

0

は、次の関数を考えてみましょう:

(defun itemcount (lst) 
    (if lst (cons (- (length lst) (length (setq lst (vl-remove (car lst) lst)))) (itemcount lst))) 
) 

それらが与えリストに遭遇しているように、この関数は、各アイテムの出現数のリストを返します。

_$ (itemcount '(3 3 3 1 1 2)) 
(3 2 1) 

順序付けされた結果を得るには、関数を評価する前に例えば(しかしvl-sortが重複整数を削除することを注意してください、そうvl-sort-iを使用):最後に

_$ (setq lst '(3 3 3 1 1 2)) 
(3 3 3 1 1 2) 
_$ (itemcount (mapcar '(lambda (n) (nth n lst)) (vl-sort-i lst '<))) 
(2 1 3) 
関連する問題