บทความนี้จะแนะนำวิธีการใช้ฟังก์ชั่นของการสุ่มไม่มีตัวเลขซ้ำ ๆ ใน Java หากคุณเป็นผู้เริ่มต้นมีความจำเป็นต้องอ่านบทความนี้เนื่องจากคุณลักษณะนี้จะพบได้โดยทั่วไปในระหว่างการสัมภาษณ์ รวมถึงเมื่อฉันรับสมัครคนฉันก็อยากถามคนอื่นเกี่ยวกับคำถามนี้โดยเฉพาะอย่างยิ่งเพื่อดูว่ารูปแบบและความรู้พื้นฐานเกี่ยวกับปัญหาได้รับการพิจารณาอย่างไร
ฉันหวังว่าบทความนี้จะช่วยเพื่อนที่ติดต่อเป็นครั้งแรกเพราะฉันได้ติดต่อเพื่อนบางคนที่ไม่สามารถเขียนหรือใช้วิธีคิดที่เรียบง่ายเพื่อให้บรรลุเป้าหมาย
โดยทั่วไปเพื่อนที่มีประสบการณ์การพัฒนาบางอย่างสามารถใช้งานได้ แต่เป็นเพียงเรื่องของประสิทธิภาพ เมื่อเราเผชิญกับปัญหาดังกล่าวเรามักจะคิดถึงมันอย่างตรงไปตรงมาจากนั้นเพิ่มตัวเลขสุ่มลงในอาร์เรย์ในลูป ในกระบวนการเพิ่มตัวเลขก่อนอื่นให้ค้นหาว่าตัวเลขนี้มีอยู่ในอาร์เรย์หรือไม่ หากหมายเลขนี้ไม่มีอยู่จะมีการเพิ่มโดยตรงไปยังอาร์เรย์ หากตัวเลขนี้มีอยู่จะไม่เพิ่ม เรามักจะพิจารณาปัญหาด้วยวิธีนี้และเราสามารถใช้ฟังก์ชั่นด้วยวิธีนี้ อย่างที่ฉันพูดตอนนี้มันเป็นเรื่องของประสิทธิภาพ
เพื่อให้เข้าใจถึงความหมายของคำถามนี้ได้ดีขึ้นก่อนอื่นลองดูที่เนื้อหาเฉพาะ: สร้างอาร์เรย์แบบสุ่มของ 1-100 แต่ตัวเลขในอาร์เรย์ไม่สามารถทำซ้ำได้นั่นคือตำแหน่งนั้นสุ่ม แต่องค์ประกอบของอาร์เรย์ไม่สามารถทำซ้ำได้
ที่นี่เราไม่ได้ระบุความยาวของอาร์เรย์เราสามารถทำให้ความยาวใด ๆ ระหว่าง 1-100
จากนั้นมาดูวิธีการใช้งานหลายวิธีและ เปรียบเทียบวิธีการเหล่านี้
โดยปกติแล้วเราจะใช้ ArrayList หรือ Array เพื่อนำไปใช้ ก่อนอื่นให้ดูที่กระบวนการใช้งานของ ArrayList ดังที่แสดงในรหัสต่อไปนี้:
นำเข้า java.util.arraylist; นำเข้า java.util.random;/** * การใช้งานโดยใช้ arraylist * @description: * @file: demo.java * @package none * @author hanyonglu * @date 2012-18-18 06:16:55 วัตถุ [] ค่า = วัตถุใหม่ [20]; สุ่มสุ่ม = ใหม่สุ่ม (); arrayList <integer> list = new ArrayList <integer> (); สำหรับ (int i = 0; i <value.length; i ++) {int number = random.nextint (100)+1; if (! list.contains (หมายเลข)) {list.add (หมายเลข); }} values = list.toarray (); // สำรวจอาร์เรย์และพิมพ์ข้อมูลสำหรับ (int i = 0; i <value.length; i ++) {system.out.print (ค่า [i]+"/t"); if ((i + 1) % 10 == 0) {system.out.println ("/n"); - กระบวนการดำเนินการโดยใช้อาร์เรย์มีดังนี้:
นำเข้า java.util.random;/** * การใช้งานโดยใช้อาร์เรย์ * @description: * @file: demo4.java * @package none * @author hanyonglu * @date 2012-10-18 06:27:38 pm * @version v1.0 * สุ่มสุ่ม = ใหม่สุ่ม (); สำหรับ (int i = 0; i <value.length; i ++) {int number = random.nextint (100)+1; สำหรับ (int j = 0; j <= i; j ++) {ถ้า (number! = ค่า [j]) {ค่า [i] = number; }}} // Traverse อาร์เรย์และพิมพ์ข้อมูลสำหรับ (int i = 0; i <value.length; i ++) {system.out.print (ค่า [i]+"/t"); if ((i + 1) % 10 == 0) {system.out.println ("/n"); - กระบวนการดำเนินการสองกระบวนการข้างต้นนั้นค่อนข้างไม่มีประสิทธิภาพ เนื่องจากทุกครั้งที่คุณเพิ่มคุณต้องสำรวจว่าตัวเลขนี้มีอยู่ในรายการปัจจุบันความซับซ้อนของเวลาคือ o (n^2) เราสามารถคิดได้ด้วยวิธีนี้: เนื่องจากไม่มีการทำซ้ำที่เกี่ยวข้องเราจึงสามารถคิดเกี่ยวกับฟังก์ชั่นของ Hashset และ HashMap HashSet ใช้อินเทอร์เฟซที่ตั้งไว้และคำจำกัดความทางคณิตศาสตร์ของชุดเป็นชุดที่ไม่มีการทำซ้ำและคำสั่ง HashMap ใช้แผนที่และยังเป็นคีย์ที่ไม่อนุญาตให้มีการซ้ำซ้อน วิธีนี้เราสามารถใช้ hashmap หรือ hashset เพื่อให้ได้มัน
เมื่อใช้การใช้งาน HASHMAP คุณจะต้องแปลงคีย์เป็นอาร์เรย์และจะโอเคดังนี้:
นำเข้า java.util.hashmap; นำเข้า java.util.iterator; นำเข้า java.util.random; นำเข้า java.util.map.entry;/** * การใช้งานโดยใช้ hashmap * @description: * @file: demo.java * @package none * @author hanyonglu * v1.0 */การสาธิตคลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {int n = 0; วัตถุ [] ค่า = วัตถุใหม่ [20]; สุ่มสุ่ม = ใหม่สุ่ม (); hashmap <object, object> hashmap = new hashmap <object, object> (); // สร้างหมายเลขสุ่มและเก็บ hashmap สำหรับ (int i = 0; i <value.length; i ++) {int number = random.nextint (100)+1; hashmap.put (หมายเลข, i); } // นำเข้าค่าอาร์เรย์จากค่า hashmap = hashmap.keyset (). toarray (); // สำรวจอาร์เรย์และพิมพ์ข้อมูลสำหรับ (int i = 0; i <value.length; i ++) {system.out.print (ค่า [i]+"/t"); if ((i + 1) % 10 == 0) {system.out.println ("/n"); }} // iterator iter = hashmap.entryset (). iterator (); // // traversal hashmap // ในขณะที่ (iter.hasnext ()) {// รายการ <จำนวนเต็ม, integer> รายการ = (รายการ) iter.next () "/t"); // // ถ้า (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 * @version v1.0 สุ่ม (); วัตถุ [] ค่า = วัตถุใหม่ [20]; HashSet <Integer> hashSet = new hashset <integer> (); // สร้างหมายเลขสุ่มและเก็บ hashset สำหรับ (int i = 0; i <value.length; i ++) {int number = random.nextint (100)+1; hashset.add (หมายเลข); } values = hashSet.toArray (); // สำรวจอาร์เรย์และพิมพ์ข้อมูลสำหรับ (int i = 0; i <value.length; i ++) {system.out.print (ค่า [i]+"/t"); 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 * @version v1.0 สุ่ม (); วัตถุ [] ค่า = วัตถุใหม่ [20]; HashSet <Integer> hashSet = new hashset <integer> (); // สร้างหมายเลขสุ่มและเก็บ hashset ในขณะที่ (hashset.size () <value.length) {hashset.add (random.nextint (100) + 1); } values = hashSet.toArray (); // สำรวจอาร์เรย์และพิมพ์ข้อมูลสำหรับ (int i = 0; i <value.length; i ++) {system.out.print (ค่า [i]+"/t"); if ((i + 1) % 10 == 0) {system.out.println ("/n"); -เราสามารถตั้งค่าความยาวของอาร์เรย์เป็น 100 และตรวจสอบเอฟเฟกต์การทำงานดังแสดงในรูปด้านล่าง:
เมื่อเทียบกับข้างต้นการใช้ HASHMAP นั้นค่อนข้างมีประสิทธิภาพ ในความเป็นจริงมันเป็น Hashset, อาร์เรย์และในที่สุดก็เป็น ArrayList หากเราสร้างข้อมูล 10,000 เราจะพบว่าการใช้ 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 * @version v1.0 * int temp1, temp2, temp3; สุ่ม r = ใหม่สุ่ม (); สำหรับ (int i = 0; i <ค่าความยาว; i ++) {ค่า [i] = i+1; } // ค่าแลกเปลี่ยนแบบสุ่มเวลาเวลาสำหรับ (int i = 0; i <value.length; i ++) {temp1 = math.abs (r.nextint ()) % (values.length-1); // สุ่มสร้างตำแหน่งหนึ่งตำแหน่ง temp2 = math.abs (r.nextint ()) % (values.length-1); // สุ่มสร้างตำแหน่งอื่นถ้า (temp1! = temp2) {temp3 = ค่า [temp1]; ค่า [temp1] = ค่า [temp2]; ค่า [temp2] = temp3; }} // Traverse อาร์เรย์และพิมพ์ข้อมูลสำหรับ (int i = 0; i <20; i ++) {system.out.print (ค่า [i]+"/t"); if ((i + 1) % 10 == 0) {system.out.println ("/n"); - วิธีนี้ยังค่อนข้างมีประสิทธิภาพ หากมีการสร้างข้อมูล 10,000 ข้อมูลเวลาที่ใช้คือ 0.054s
ขึ้นอยู่กับการใช้พิกัดในอาร์เรย์โซลูชั่นที่เกี่ยวข้องเพิ่มเติมสามารถเปลี่ยนได้และคุณสามารถอ้างถึงข้อมูลที่เกี่ยวข้องในรายละเอียด
ข้างต้นเป็นเรื่องเกี่ยวกับการใช้ฟังก์ชันของตัวเลขสุ่มที่ไม่ใช่ซ้ำใน Java แน่นอนว่าวิธีการไม่ จำกัด เฉพาะประเภทเหล่านี้ แต่มีวิธีการใช้งานอื่น ๆ ฉันหวังว่ามันจะเป็นประโยชน์กับเพื่อนที่ได้รับการติดต่อมาระยะหนึ่งแล้วและฉันหวังว่ามันจะมีบทบาทในการดึงดูดและดึงดูดหยก
เว็บไซต์ดั้งเดิม: http://www.cnblogs.com/hanyonglu/archive/2012/10/18/2730007.html
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น