أنا بحاجة إلى الانضمام إلى قائمتين نوع منهم و إزالة التكرارات.هل هناك طريقة أفضل للقيام بذلك ؟

StackOverflow https://stackoverflow.com/questions/100048

  •  01-07-2019
  •  | 
  •  

سؤال

لدي اثنين لم يتم فرزها قوائم وأنا في حاجة إلى إنتاج آخر القائمة التي تم فرزها حيث جميع العناصر التي هي فريدة من نوعها.

عناصر يمكن أن تحدث عدة مرات في كل القوائم و هم أصلا لم يتم فرزها.

بلدي وظيفة تبدو مثل هذا:

(defun merge-lists (list-a list-b sort-fn)
    "Merges two lists of (x, y) coordinates sorting them and removing dupes"
    (let   ((prev nil))
        (remove-if
            (lambda (point)
                (let   ((ret-val (equal point prev)))
                    (setf prev point)
                    ret-val))
            (sort
                (merge 'list list-a list-b sort-fn) ;'
                 sort-fn))))

هل هناك طريقة أفضل لتحقيق نفس الشيء ؟

نموذج الاتصال:

[CL]> (merge-lists '(9 8 4 8 9 7 2) '(1 7 3 9 2 6) #'>)
  ==> (9 8 7 6 4 3 2 1)
هل كانت مفيدة؟

المحلول

حينا ودية يسب المعلم أشار إلى إزالة التكرارات وظيفة.

كما قدم المقتطف التالي:

(defun merge-lists (list-a list-b sort-fn test-fn)
    (sort (remove-duplicates (append list-a list-b) :test test-fn) sort-fn))

نصائح أخرى

أعتقد أن أول فرز القوائم اثنين على حدة ومن ثم دمجها مع وظيفة أيضا أن يتخطى التكرارات.هذا ينبغي أن يكون أسرع قليلا كما أنه يتطلب أقل من اجتياز كل القوائم.

P. S.:أشك أنه يمكن أن يتم بشكل أسرع كما كنت في الأساس تحتاج دائما واحدة على الأقل نوع واحد الدمج.ربما يمكنك الجمع بين كل من في وظيفة واحدة ، لكن لن أكون مندهشا إذا لم تجعل (الكبير) الفرق.

إذا كانت قوائم فرز قبل دمجها ، يمكن دمج مكررة-إزالة وفرزها في نفس الوقت.إذا كان يتم فرزها و مكررة خالية ، ثم دمج/فرز/مكررة-إزالة وظيفة يصبح حقا تافهة.

في الواقع ، قد يكون من الأفضل تغيير إدراج دالة بحيث ينفذ فرز الإدراج الذي يتحقق عن التكرارات.ثم لديك دائما فرز قوائم خالية من التكرارات ، ودمجها هو مسألة تافهة.

ثم مرة أخرى قد تفضل أن يكون سريع إدراج دالة على حساب الفرز/إزالة التكرارات في وقت لاحق.

لا إزالة التكرارات وظيفة تعمل بشكل أفضل إذا كان نوع كان يطبق قبل إزالة التكرارات ؟

كما Antti أشار ربما كنت ترغب في الاستفادة إزالة التكرارات و النوع ، وإن كان من المحتمل استخدام الكلمة (أو اختياري الحجة) لاختبار وظيفة:(defun دمج القوائم (قائمة-1 قائمة-2 نوع fn &key (اختبار #'eql)) ...) أو (defun دمج القوائم (قائمة-1 قائمة-2 نوع fn &الاختياري (اختبار #'eql) ...)

هذه الطريقة لن تضطر إلى تحديد اختبار وظيفة (المستخدمة من قبل إزالة التكرارات لاختبار "هذه تعتبر مكررة") ، ما لم EQL ليست جيدة بما فيه الكفاية.

يبدو أنك تحتاج إلى استخدام مجموعات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top