Artikel ini akan memperkenalkan kepada Anda cara mengimplementasikan fungsi acak, tidak ada angka berulang di Java. Jika Anda seorang pemula, perlu membaca artikel ini, karena fitur ini umumnya akan ditemui selama wawancara. Termasuk ketika saya merekrut orang, saya juga suka bertanya kepada orang lain tentang pertanyaan ini, terutama untuk melihat bagaimana model dan pengetahuan dasar tentang masalah dipertimbangkan.
Saya harap artikel ini dapat membantu teman -teman yang berhubungan untuk pertama kalinya, karena saya telah menghubungi beberapa teman yang tidak dapat menulisnya atau menggunakan cara berpikir yang sangat datar untuk mencapainya.
Secara umum, teman dengan beberapa pengalaman pengembangan dapat menerapkan fungsi seperti itu, tetapi itu hanya masalah efisiensi. Ketika kita menghadapi masalah seperti itu, kita selalu memikirkannya dalam urutan lurus, dan kemudian menambahkan angka acak ke array dalam satu loop. Dalam proses penambahan angka, pertama cari apakah nomor ini ada di array. Jika nomor ini tidak ada, itu akan ditambahkan langsung ke array; Jika nomor ini ada, itu tidak akan ditambahkan. Kami biasanya mempertimbangkan masalah dengan cara ini, dan kami dapat menerapkan fungsi dengan cara ini. Seperti yang saya katakan sekarang, itu hanya masalah efisiensi.
Untuk lebih memahami arti pertanyaan ini, mari kita lihat konten tertentu: menghasilkan array acak 1-100, tetapi angka-angka dalam array tidak dapat diulang, yaitu, posisinya acak, tetapi elemen array tidak dapat diulang.
Di sini, kami belum menentukan panjang array, kami dapat membuatnya antara 1-100.
Selanjutnya, mari kita lihat beberapa metode implementasi dan bandingkan metode ini .
Biasanya kami akan menggunakan arraylist atau array untuk mengimplementasikannya. Pertama -tama mari kita lihat proses implementasi ArrayList, seperti yang ditunjukkan pada kode berikut:
Impor java.util.arraylist; import java.util.random;/** * Implementasi menggunakan arraylist * @description: * @file: demo.java * @package tidak ada * @author hanyonglu * @date 2012-10-18 06:16:55 pm * @version v1.version V1.0 * {public v1.10-18 06:16:55 pm * @version v1.version v1.version V1.0 Objek [] values = objek baru [20]; Acak acak = acak baru (); ArrayList <Integer> Daftar = ArrayList baru <Integer> (); untuk (int i = 0; i <values.length; i ++) {int number = random.nextInt (100)+1; if (! list.contains (angka)) {list.add (angka); }} values = list.toArray (); // melintasi array dan mencetak data untuk (int i = 0; i <values.length; i ++) {System.out.print (nilai [i]+"/t"); if ((i + 1) % 10 == 0) {System.out.println ("/n"); }}}} Proses penerapan menggunakan array adalah sebagai berikut:
Impor java.util.random;/** * Implementasi Menggunakan array * @description: * @file: demo4.java * @package tidak ada * @author hanyonglu * @date 2012-10-18 06:27:38 pm * @version v1.0 */Kelas publik Demo4 {public static void void public void (pm. Acak acak = acak baru (); untuk (int i = 0; i <values.length; i ++) {int number = random.nextInt (100)+1; untuk (int j = 0; j <= i; j ++) {if (angka! = nilai [j]) {values [i] = angka; }}} // melintasi array dan mencetak data untuk (int i = 0; i <values.length; i ++) {System.out.print (nilai [i]+"/t"); if ((i + 1) % 10 == 0) {System.out.println ("/n"); }}}} Dua proses implementasi di atas relatif tidak efisien. Karena setiap kali Anda menambahkan, Anda harus melintasi apakah nomor ini ada dalam daftar saat ini, kompleksitas waktu adalah O (n^2). Kita dapat memikirkannya seperti ini: karena tidak ada duplikasi yang terlibat, kita dapat memikirkan fungsi hashset dan hashmap. Hashset mengimplementasikan antarmuka yang ditetapkan, dan definisi matematika set adalah set tanpa duplikasi dan ketertiban. HashMap mengimplementasikan peta, dan itu juga merupakan kunci yang tidak mengizinkan duplikat. Dengan cara ini kita dapat menggunakan hashmap atau hashset untuk mencapainya.
Saat menggunakan implementasi hashmap, Anda hanya perlu mengubah kuncinya menjadi array dan akan baik -baik saja, sebagai berikut:
Impor java.util.hashmap; import java.util.iterator; impor java.util.random; import java.util.map.entry;/** * implementasi menggunakan hashmap * @description: * @file: demo.java * @package none * @author hanyong lanyong: pmo: 106-@package V1.0 */Demo kelas publik {public static void main (string [] args) {int n = 0; Objek [] values = objek baru [20]; Acak acak = acak baru (); Hashmap <objek, objek> hashmap = hashmap baru <objek, objek> (); // menghasilkan angka acak dan menyimpan hashmap untuk (int i = 0; i <values.length; i ++) {int number = random.nextInt (100)+1; hashmap.put (angka, i); } // Impor nilai array dari nilai hashmap = hashmap.keyset (). Toarray (); // melintasi data array dan cetak untuk (int i = 0; i <values.length; i ++) {System.out.print (nilai [i]+"/t"); if ((i + 1) % 10 == 0) {System.out.println ("/n"); }} // iterator iter = hashmap.entryset (). Iterator (); // // traversal hashmap // while (iter.hasnext ()) {// entri <integer, integer> entri = (entri) iter.next (); // int key = entry.getkey (); "/t"); // // if (n % 10 == 0) {// System.out.println ("/n"); //} //}}} Karena hubungan antara hashset dan hashmap terlalu dekat, hashset diimplementasikan menggunakan hashmap di bagian bawah, tetapi tidak ada kumpulan nilai dan hanya satu kumpulan kunci, sehingga juga dapat diimplementasikan menggunakan hashset, sebagai berikut:
impor java.util.hashset; impor java.util.random;/** * Implementasi menggunakan hashset * @description: * @file: test.java * @package tidak ada * @author hanyonglu * @Date 2012-10-18 06:11:41 pm * @version v1.0 Acak(); Objek [] values = objek baru [20]; Hashset <Integer> hashset = hashset baru <Integer> (); // menghasilkan angka acak dan menyimpan hashset untuk (int i = 0; i <values.length; i ++) {int number = random.nextInt (100)+1; hashset.add (angka); } values = hashset.toArray (); // melintasi data array dan cetak untuk (int i = 0; i <values.length; i ++) {System.out.print (nilai [i]+"/t"); if ((i + 1) % 10 == 0) {System.out.println ("/n"); }}}} Ini sedikit lebih efisien. Jika kita telah membatasi panjang array, kita hanya perlu mengubah loop untuk dan mengaturnya ke loop whlie. Seperti yang ditunjukkan di bawah ini:
import java.util.HashSet;import java.util.Random;/** * Implementation using HashSet* @Description: * @File: Test.java * @Package None * @Author Hanyonglu * @Date 2012-10-18 05:11:41 pm * @Version V1.0 */public class Test { public static void main(String[] args) { Random random = new Acak(); Objek [] values = objek baru [20]; Hashset <Integer> hashset = hashset baru <Integer> (); // menghasilkan angka acak dan menyimpan hashset while (hashset.size () <values.length) {hashset.add (random.nextInt (100) + 1); } values = hashset.toArray (); // melintasi array dan mencetak data untuk (int i = 0; i <values.length; i ++) {System.out.print (nilai [i]+"/t"); if ((i + 1) % 10 == 0) {System.out.println ("/n"); }}}}Kami dapat mengatur panjang array ke 100 dan memeriksa efek berjalan seperti yang ditunjukkan pada gambar di bawah ini:
Dibandingkan dengan di atas, menggunakan hashmap relatif efisien. Faktanya, ini adalah hashset, array, dan akhirnya daftar array. Jika kami menghasilkan 1000 data, kami akan menemukan bahwa menggunakan HashMap membutuhkan waktu: 0,05S, hashset adalah 0,07s, array adalah 0,20s, dan arraylist adalah 0,25s. Jika Anda tertarik, Anda dapat mengatur waktu untuk memeriksanya.
Tentu saja, selain menggunakan implementasi hashmap, ada metode efisien lainnya. Misalnya, kita dapat menyimpan nomor 1-100 dalam array, dan kemudian secara acak menghasilkan dua subskrip di loop untuk. Jika kedua subskrip ini tidak sama, kami dapat bertukar elemen dalam array. Proses implementasi adalah sebagai berikut:
Impor java.util.random;/** * Implementasi konversi posisi acak * @description: * @file: demo4.java * @package tidak ada * @author hanyonglu * @Date 2012-10-18 06:54:06 pm * @version v1.0 */kelas publik Demo4 {public static static void void [public void) [STREP) {Public void {public void {pm. int temp1, temp2, temp3; Acak r = acak baru (); untuk (int i = 0; i <values.length; i ++) {values [i] = i+1; } // Nilai pertukaran secara acak. Times panjang untuk (int i = 0; i <values.length; i ++) {temp1 = math.abs (r.nextint ()) % (values.length-1); // Hasilkan secara acak satu posisi temp2 = math.abs (r.nextint ()) % (values.length-1); // menghasilkan posisi lain secara acak jika (temp1! = Temp2) {temp3 = nilai [temp1]; nilai [temp1] = nilai [temp2]; nilai [temp2] = temp3; }} // melintasi array dan mencetak data untuk (int i = 0; i <20; i ++) {System.out.print (nilai [i]+"/t"); if ((i + 1) % 10 == 0) {System.out.println ("/n"); }}}} Metode ini juga relatif efisien. Jika 10.000 data dihasilkan, waktu yang dibutuhkan adalah 0,054s.
Berdasarkan implementasi koordinat dalam array, solusi yang lebih terkait dapat diubah, dan Anda dapat merujuk ke informasi yang relevan secara rinci.
Di atas adalah tentang mengimplementasikan fungsi bilangan acak, non-berulang di Java. Tentu saja, metode ini tidak terbatas pada jenis ini, tetapi ada metode implementasi lainnya. Saya berharap ini akan membantu bagi teman -teman yang telah berhubungan untuk sementara waktu, dan saya harap ini dapat berperan dalam menarik dan menarik Jade.
Situs web asli: http://www.cnblogs.com/hanyonglu/archive/2012/10/18/2730007.html
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.