Secara umum, teman-teman yang memiliki pengalaman pengembangan dapat mewujudkan fungsi seperti itu, tetapi ini hanya masalah efisiensi. Ketika kita biasanya menghadapi masalah seperti itu, kita selalu memikirkannya dalam urutan datar. Pertama, buat sebuah array, lalu tambahkan angka acak ke dalam array dalam satu lingkaran. Selama proses penambahan angka, periksa dulu apakah ada di dalam array .Jika nomor ini tidak ada, maka akan ditambahkan langsung ke array; jika ada, maka tidak akan ditambahkan. Kita umumnya memikirkan masalah dengan cara ini, dan fungsi dapat dicapai dengan berpikir seperti ini. Seperti yang saya katakan tadi, ini hanyalah masalah efisiensi.
Untuk lebih memahami arti pertanyaan ini, pertama-tama mari kita lihat konten spesifiknya: buat array acak 1-100, tetapi angka-angka dalam array tidak dapat diulang, yaitu posisinya acak, tetapi elemen array tidak dapat diulangi. Di sini, panjang array tidak ditentukan untuk kita, kita bisa membiarkannya panjangnya antara 1-100.
Selanjutnya mari kita lihat bagaimana cara mengimplementasikannya dengan lebih baik. Biasanya kita akan menggunakan ArrayList untuk mengimplementasikannya, seperti yang ditunjukkan pada kode berikut:
Copy kode kodenya sebagai berikut:
paket cn.sunzn.randomnumber;
impor java.util.ArrayList;
import java.util.Acak;
Demo kelas publik {
public static void main(String[] args) {
Nilai Objek[] = Objek baru[20];
Acak acak = baru Acak();
Daftar Array<Bilangan Bulat> daftar = Daftar Array baru<Bilangan Bulat>();
for (int i = 0; i < nilai.panjang; i++) {
int angka = acak.nextInt(100) + 1;
if (!daftar.berisi(angka)) {
daftar.tambahkan(angka);
}
}
nilai = daftar.toArray();
/************ Lintasi array dan cetak datanya************/
for (int i = 0; i < nilai.panjang; i++) {
Sistem.keluar.cetak(nilai[i] + "/t");
jika ((i + 1) % 10 == 0) {
Sistem.keluar.println("/n");
}
}
}
}
Proses implementasi di atas relatif tidak efisien. Karena setiap kali Anda menambahkannya, Anda harus menelusuri apakah nomor tersebut ada dalam daftar saat ini, kompleksitas waktunya adalah O(N^2). Kita dapat memikirkannya seperti ini: Karena tidak melibatkan duplikasi, kita dapat memikirkan fungsi HashSet dan HashMap. HashSet mengimplementasikan antarmuka Set. Definisi matematis dari Set adalah kumpulan tanpa duplikasi dan keteraturan. HashMap mengimplementasikan Peta dan tidak mengizinkan Kunci duplikat. Dengan cara ini kita dapat menggunakan HashMap atau HashSet untuk mencapai hal ini.
Saat menggunakan HashMap untuk mengimplementasikannya, Anda hanya perlu mengubah kuncinya menjadi array.
Copy kode kodenya sebagai berikut:
paket cn.sunzn.randomnumber;
impor java.util.HashMap;
import java.util.Acak;
Demo kelas publik {
public static void main(String[] args) {
Nilai Objek[] = Objek baru[20];
Acak acak = baru Acak();
HashMap<Objek, Objek> hashMap = HashMap baru<Objek, Objek>();
/******* Hasilkan nomor acak dan simpan di HashMap *******/
for (int i = 0; i < nilai.panjang; i++) {
int angka = acak.nextInt(100) + 1;
hashMap.put(angka, i);
}
/************ Impor array dari HashMap************/
nilai = hashMap.keySet().toArray();
/*********** Lintasi array dan cetak datanya************/
for (int i = 0; i < nilai.panjang; i++) {
Sistem.keluar.cetak(nilai[i] + "/t");
jika ((i + 1) % 10 == 0) {
Sistem.keluar.println("/n");
}
}
}
}
Karena hubungan antara HashSet dan HashMap terlalu dekat, HashSet diimplementasikan menggunakan HashMap di lapisan paling bawah. Namun, tidak ada kumpulan Nilai, hanya kumpulan Kunci, sehingga dapat juga diimplementasikan menggunakan HashSet. Kodenya adalah sebagai berikut :
Copy kode kodenya sebagai berikut:
paket cn.sunzn.randomnumber;
impor java.util.HashSet;
import java.util.Acak;
Demo kelas publik {
public static void main(String[] args) {
Acak acak = baru Acak();
Nilai Objek[] = Objek baru[20];
HashSet<Bilangan Bulat> hashSet = HashSet<Bilangan Bulat>();
/******* Hasilkan nomor acak dan simpan di HashSet *******/
for (int i = 0; i < nilai.panjang; i++) {
int angka = acak.nextInt(100) + 1;
hashSet.tambahkan(angka);
}
nilai = hashSet.toArray();
/************* Lintasi array dan cetak datanya**********/
for (int i = 0; i < nilai.panjang; i++) {
Sistem.keluar.cetak(nilai[i] + "/t");
jika ((i + 1) % 10 == 0) {
Sistem.keluar.println("/n");
}
}
}
}
Implementasi ini sedikit lebih efisien. Jika kita membatasi panjang array, kita hanya perlu mengubah perulangan for dan menyetelnya menjadi perulangan whlie. Seperti yang ditunjukkan di bawah ini:
Copy kode kodenya sebagai berikut:
paket cn.sunzn.randomnumber;
impor java.util.HashSet;
import java.util.Acak;
Demo kelas publik {
public static void main(String[] args) {
Acak acak = baru Acak();
Nilai Objek[] = Objek baru[20];
HashSet<Bilangan Bulat> hashSet = HashSet<Bilangan Bulat>();
/****** Hasilkan nomor acak dan simpan di HashSet ******/
while (hashSet.ukuran() < nilai.panjang) {
hashSet.tambahkan(acak.nextInt(100) + 1);
}
nilai = hashSet.toArray();
/************ Lintasi array dan cetak datanya************/
for (int i = 0; i < nilai.panjang; i++) {
Sistem.keluar.cetak(nilai[i] + "/t");
jika ((i + 1) % 10 == 0) {
Sistem.keluar.println("/n");
}
}
}
}