هل هناك طريقة لتطبيق Knuth المراوغة إلى كومة بنية البيانات ؟

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

سؤال

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

هذه الطريقة لا تعمل على الرغم من مداخن (من الواضح) ، ولكن أعتقد كومة هيكل سوف تعمل بشكل أفضل على هذا البرنامج لأنه قد البوب ودفع بطاقات من سطح السفينة.

هل كانت مفيدة؟

المحلول

سواء java.util.ArrayList<E> و java.util.stack<E> تنفيذ java.util.List<E> واجهة ، Collections.shuffle() يأخذ java.util.List<?> كمعلمة.يجب أن تكون قادرة على تمرير Stack في Collections.shuffle(), إلا إذا كنت تستخدم مختلف مكدس التنفيذ الذي لا ينفذ java.util.list<E>.إذا كنت أنصح لك أن التحول إلى أشكال مختلفة من كومة التنفيذ.

نصائح أخرى

اعتقد انه من الاسهل بكثير أن تفعل كومة العمليات على ArrayList.

كومة قائمة ، حتى تتمكن من استدعاء مجموعات.خلط ورق اللعب() على المكدس.

وقال كومة قديم الصف ، مثل ناقلات نوع من عفا عليها الزمن.في الوقت الحاضر يجب أن تستخدم Dequeue (مزدوجة المنتهية في قائمة الانتظار التي تعمل إما الانتظار أو كومة) بدلا من كومة ولكن, Dequeues لا يسرد حتى لا تكون تعديلا.

أيضا, يمكنك دائما وضع البطاقات الخاصة بك في قائمة تخلط ثم يضاف كل منهم إلى Dequeue

لا يوجد أي سبب لماذا كومة هيكل لا ينبغي أن يكون الوصول العشوائي وكذلك (جافا.util.كومة لا, على الرغم من أن لديه مشاكل خاصة بها).بخلاف ذلك يمكنك البوب العناصر من المكدس في ArrayList, خلط ورق اللعب ومن ثم دفع لهم مرة أخرى على المكدس.

لا فيشر-ييتس خلط تعتمد على العشوائية الوصول إلى البيانات.تحتاج إلى جمع بعض مما يتيح الحصول على(int index).إذا كنت بحاجة إلى كومة مجرد استخدام القائمة.push و pop فقط اتصل على(0) وإضافة(0).هذا هو أفضل من تنفيذ بعض مخصص كومة الدرجة.استخدام ما لديك لا يخترع فئات جديدة.

آدم الجواب هو أفضل كومة.للحصول على بطاقة ألعاب, ما أنا عادة استخدام بسيط arraylist و إزالة العناصر العشوائية.لا يوجد خلط المطلوبة.

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

منذ جافا لا تسمح لك علاج كومة عشوائية قائمة فقط نسخ من المكدس في ArrayList للقيام خلط المرحلة (إضافية 52 عنصرا ArrayList يضجون ليس صفقة كبيرة)

مجموعات.خلط ورق اللعب() طريقة يفعل ذلك بالنسبة لك أنت لا يجب أن بشكل صريح.

"إذا كان المحدد القائمة لا تنفذ RandomAccess واجهة كبيرة ، تنفيذ هذا خلط() مقالب المحدد القائمة في صفيف قبل خلط و مقالب تعديلا مجموعة مرة أخرى إلى القائمة.هذا يتجنب الدرجة الثانية السلوك الذي يمكن أن ينتج من خلط "الوصول المتسلسل" قائمة في المكان".

هذا هو ما java وثائق يقول عن المجموعات.خلط ورق اللعب() طريقة تنفيذ حتى يمر جافا.util.المكدس (تنفيذ جافا.util.قائمة واجهة) يجب أن تعمل...

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