ستقدم لك هذه المقالة كيفية تنفيذ وظيفة عشوائية ، ولا توجد أرقام متكررة في Java. إذا كنت مبتدئًا ، فمن الضروري قراءة هذه المقالة ، لأنه سيتم مواجهة هذه الميزة عمومًا أثناء المقابلات. بما في ذلك عندما أقوم بتجنيد أشخاص ، أود أيضًا أن أسأل الآخرين عن هذا السؤال ، وذلك أساسًا لمعرفة كيف يتم النظر في النموذج والمعرفة الأساسية للمشكلة.
آمل أن يساعد هذا المقال الأصدقاء على اتصال لأول مرة ، لأنني اتصلت ببعض الأصدقاء الذين لا يستطيعون كتابته أو استخدام طريقة مسطحة للغاية للتفكير لتحقيق ذلك.
بشكل عام ، يمكن للأصدقاء ذوي الخبرة في مجال التطوير تنفيذ مثل هذه الوظائف ، ولكنها مجرد مسألة كفاءة. عندما نواجه مثل هذه المشكلات ، فإننا نفكر دائمًا في ترتيب مستقيم ، ثم أضف أرقامًا عشوائية إلى الصفيف في حلقة. في عملية إضافة أرقام ، ابحث أولاً عما إذا كان هذا الرقم موجودًا في الصفيف. إذا لم يكن هذا الرقم موجودًا ، فسيتم إضافته مباشرة إلى الصفيف ؛ إذا كان هذا الرقم موجودًا ، فلن تتم إضافته. عادة ما نعتبر المشكلة بهذه الطريقة ، ويمكننا تنفيذ وظائف بهذه الطريقة. كما قلت الآن ، إنها مجرد مسألة كفاءة.
من أجل فهم معنى هذا السؤال بشكل أفضل ، دعونا نلقي نظرة أولاً على المحتوى المحدد: إنشاء صفيف عشوائي من 1-100 ، ولكن لا يمكن تكرار الأرقام الموجودة في الصفيف ، أي أن المواضع عشوائية ، ولكن لا يمكن تكرار عناصر الصفيف.
هنا ، لم نحدد طول المصفوفة ، يمكننا أن نجعله طولًا بين 1-100.
بعد ذلك ، دعونا نلقي نظرة على العديد من طرق التنفيذ ومقارنة هذه الأساليب .
عادةً ما نستخدم ArrayList أو Array لتنفيذها. دعونا أولاً نلقي نظرة على عملية تنفيذ ArrayList ، كما هو موضح في الكود التالي:
استيراد java.util.arraylist ؛ استيراد java.util.random ؛/** * تطبيق باستخدام ArrayList * description: * @file: demo.java * @package none * author hanyonglu * @static [] القيم = كائن جديد [20] ؛ عشوائي عشوائي = جديد عشوائي () ؛ ArrayList <integer> list = new ArrayList <integer> () ؛ لـ (int i = 0 ؛ i <values.length ؛ i ++) {int number = random.nextint (100)+1 ؛ if (! list.contains (number)) {list.add (number) ؛ }} القيم = list.toarray () ؛ . if ((i + 1) ٪ 10 == 0) {system.out.println ("/n") ؛ }}}} عملية التنفيذ باستخدام المصفوفات هي كما يلي:
استيراد java.util.random ؛/** * التنفيذ باستخدام المصفوفات * description: * file: demo4 عشوائي عشوائي = جديد عشوائي () ؛ لـ (int i = 0 ؛ i <values.length ؛ i ++) {int number = random.nextint (100)+1 ؛ لـ (int j = 0 ؛ j <= i ؛ j ++) {if (number! = values [j]) {stable [i] = number ؛ }}} // اجتياز الصفيف وطباعة البيانات لـ (int i = 0 ؛ i <values.length ؛ i ++) {system.out.print (values [i]+"/t") ؛ if ((i + 1) ٪ 10 == 0) {system.out.println ("/n") ؛ }}}} العمليتين التنفيذيتين أعلاه غير فعالة نسبيا. لأنه في كل مرة تضيف ، عليك اجتياز ما إذا كان هذا الرقم موجودًا في القائمة الحالية ، فإن التعقيد الزمني هو O (n^2). يمكننا التفكير في الأمر بهذه الطريقة: نظرًا لعدم وجود ازدواجية ، يمكننا التفكير في وظائف Hashset و HashMap. تقوم HashSet بتنفيذ واجهة SET ، والتعريف الرياضي للمجموعة هو مجموعة بدون ازدواجية وترتيب. تقوم HashMap بتنفيذ خريطة ، وهي أيضًا مفتاح لا يسمح بالتكرارات. وبهذه الطريقة يمكننا استخدام hashmap أو hashset لتحقيق ذلك.
عند استخدام تطبيق HashMap ، تحتاج فقط إلى تحويل مفتاحه إلى صفيف وسيكون على ما يرام ، على النحو التالي:
استيراد java.util.hashmap ؛ استيراد java.util.iterator ؛ استيراد java.util.random ؛ استيراد java.util.map.entry ؛/** * تطبيق باستخدام hashmap * @description: * @file: demo.java * packageage none * uthor hanyonglu * */demo class public {public static void main (string [] args) {int n = 0 ؛ كائن [] القيم = كائن جديد [20] ؛ عشوائي عشوائي = جديد عشوائي () ؛ HashMap <object ، Object> hashMap = new HashMap <object ، Object> () ؛ // إنشاء أرقام عشوائية وتخزين hashmap لـ (int i = 0 ؛ i <valude.length ؛ i ++) {int number = random.nextint (100)+1 ؛ hashmap.put (رقم ، i) ؛ } // قيم صفيف الاستيراد من قيم hashmap = hashmap.keyset (). tararray () ؛ . if ((i + 1) ٪ 10 == 0) {system.out.println ("/n") ؛ }} // iterator iter = hashmap.entryset (). iterator () ؛ // // traversal hashmap // بينما (iter.hasnext ()) {// entry <integer ، integer> entry = (inter) iter.next () ؛ "/t") ؛ // // if (n ٪ 10 == 0) {// system.out.println ("/n") ؛ //} //}}}} نظرًا لأن العلاقة بين Hashset و HashMap قريبة جدًا ، يتم تنفيذ Hashset باستخدام HashMap في الأسفل ، ولكن لا توجد مجموعة من القيمة ومجموعة واحدة فقط من المفاتيح ، لذلك يمكن أيضًا تنفيذها باستخدام Hashset ، على النحو التالي:
استيراد java.util.hashset ؛ استيراد java.util.random ؛/** * تطبيق باستخدام hashset * description: * @file: test.java * @package none * author hanyonglu * @date 2012-10-18 06:11:41 pm * @v1.0 * عشوائي()؛ كائن [] القيم = كائن جديد [20] ؛ hashset <integer> hashset = new hashset <integer> () ؛ // إنشاء أرقام عشوائية وتخزين التجزئة لـ (int i = 0 ؛ i <values.length ؛ i ++) {int number = random.nextint (100)+1 ؛ hashset.add (رقم) ؛ } القيم = hashset.toarray () ؛ . if ((i + 1) ٪ 10 == 0) {system.out.println ("/n") ؛ }}}} هذا أكثر كفاءة. إذا حصرنا طول المصفوفة ، فنحن بحاجة فقط إلى تحويل الحلقة وضبطها على حلقة Whlie. كما هو موضح أدناه:
استيراد java.util.hashset ؛ استيراد java.util.random ؛/** * تطبيق باستخدام hashset * description: * @file: test.java * @package none * author hanyonglu * @date 2012-10-18 05:11:41 pm * @v1.0 عشوائي()؛ كائن [] القيم = كائن جديد [20] ؛ hashset <integer> hashset = new hashset <integer> () ؛ // إنشاء أرقام عشوائية وتخزين hashset بينما (hashset.size () <values.length) {hashset.add (random.nextint (100) + 1) ؛ } القيم = hashset.toarray () ؛ . if ((i + 1) ٪ 10 == 0) {system.out.println ("/n") ؛ }}}}يمكننا ضبط طول الصفيف على 100 والتحقق من تأثير التشغيل كما هو موضح في الشكل أدناه:
بالمقارنة مع ما سبق ، فإن استخدام hashmap فعال نسبيا. في الواقع ، إنها مجموعة من التجزئة ، وهي صفيف ، وأخيراً قائمة ArrayList. إذا قمنا بإنشاء 10000 بيانات ، فسنجد أن استخدام HashMap يستغرق وقتًا: 0.05s ، Hashset هو 0.07s ، الصفيف هو 0.20s ، و ArrayList هو 0.25s. إذا كنت مهتمًا ، فيمكنك تعيين الوقت للتحقق من ذلك.
بالطبع ، بالإضافة إلى استخدام تطبيق HashMap ، هناك طرق أخرى فعالة. على سبيل المثال ، يمكننا تخزين الأرقام من 1 إلى 100 في صفيف ، ثم إنشاء اثنين من الاشتراكين بشكل عشوائي في الحلقة. إذا لم يكن هذان الاشتراكان متساويان ، فيمكننا تبادل العناصر في الصفيف. عملية التنفيذ هي كما يلي:
استيراد java.util.random ؛/** * تنفيذ تحويل الموضع العشوائي * description: * file: demo4.java * package none * author hanyonglu * @date 2012-10-18 06:54:06 pm * versupal v1.0 */public class demo4 {public static void main (] int temp1 ، temp2 ، temp3 ؛ عشوائي R = جديد عشوائي () ؛ لـ (int i = 0 ؛ i <values.length ؛ i ++) {values [i] = i+1 ؛ } // exchange بشكل عشوائي. أوقات الطول لـ (int i = 0 ؛ i <valuer.length ؛ i ++) {temp1 = math.abs (r.nextInt ()) ٪ (stable.length-1) ؛ // قم بإنشاء موقع Temp2 = Math.ABS (R.NextInt ()) ٪ بشكل عشوائي (R.NextInt ()) ٪ (القيم. Length-1) ؛ // قم بإنشاء موضع آخر بشكل عشوائي إذا (temp1! = temp2) {temp3 = القيم [temp1] ؛ القيم [temp1] = القيم [temp2] ؛ القيم [temp2] = temp3 ؛ }} // اجتياز الصفيف وطباعة البيانات لـ (int i = 0 ؛ i <20 ؛ i ++) {system.out.print (القيم [i]+"/t") ؛ if ((i + 1) ٪ 10 == 0) {system.out.println ("/n") ؛ }}}} هذه الطريقة هي أيضا فعالة نسبيا. إذا تم إنشاء 10000 بيانات ، فإن الوقت الذي يستغرقه هو 0.054s.
استنادًا إلى تنفيذ الإحداثيات في صفيف ، يمكن تحويل المزيد من الحلول ذات الصلة ، ويمكنك الرجوع إلى المعلومات ذات الصلة بالتفصيل.
ما ورد أعلاه يدور حول تنفيذ وظيفة الأرقام العشوائية غير المبتكرة في Java. بالطبع ، لا تقتصر الطرق على هذه الأنواع ، ولكن هناك طرق تنفيذ أخرى. آمل أن يكون من المفيد للأصدقاء الذين كانوا على اتصال لفترة من الوقت ، وآمل أن يلعب دورًا في جذب اليشم وجذبهم.
الموقع الأصلي: http://www.cnblogs.com/hanyonglu/archive/2012/10/18/2730007.html
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.