2011-01-05 10 views
7

私はLispの初心者です。私はLispプログラミングを学びたいと思っています。 私は、次の形式のようなテキストファイルから読み込むいくつかのリストを、ソートしたい:いくつかの要素にしたがってリストをソートする

(a 120 135 124 124) 
(b 120 135 124 124) 
(c 120 135 124 124) 

ように最初の整数要素に応じてまたは多分第二または第三及びそれらをソートするための最良の方法は何ですか?

  1. はそれらすべてを読み、
  2. 反復コンテナリストの上にリストのリストにそれらを入れて、バブルソートのように1を以下にリストの値を比較:

    は、私は、次のアイデアを持っています。

これを達成するためのデータ構造は、ソートロジックとフルフィルソートを含む類似オブジェクトを自動的に取り込むJavaのコレクションと同じように適していますか?

ありがとうございました。

答えて

10

標準sort関数は、:key引数を取り、ソートキーとして使用するオブジェクトから値を抽出するために使用できます。

(sort objects #'< :key #'second) 

は、共通の正確な仕様のためhttp://l1sp.org/cl/sortを参照してください:あなたの例では、リスト内のファイルから、各リストを持っていた場合には、破壊的ソートobjects最初の整数要素によっておよびソートされたリストを返す次objectsと呼ばれますLispのsort関数です。

1
(defun position-of-first-int (alist) 
    (position (find-if 
      #'(lambda (x) (not (numberp x))) 
      alist) 
      alist)) 

(defun sort-from-first-int (alist) 
    (sort (subseq alist (1+ (position-of-first-int alist))) #'<)) 

テスト:

> (setf a '(a 120 135 124 124)) 
> (setf b '(120 b 135 124 124)) 
> (setf c '(120 135 c 124 110)) 

> (format t "~a~%" (sort-from-first-int a)) 
(120 124 124 135) 
> (format t "~a~%" (sort-from-first-int b)) 
(124 124 135) 
> (format t "~a~%" (sort-from-first-int c)) 
(110 124) 
関連する問題