Meskipun ini adalah utas lama, tetapi menambahkan opsi lain mungkin tidak membahayakan. (Fungsi lambda JDK 1.8 tampaknya membuatnya mudah);
Masalahnya bisa dipecah menjadi langkah-langkah berikut;
- Dapatkan nilai minimum untuk daftar bilangan bulat yang disediakan (yang akan menghasilkan nomor acak unik)
- Dapatkan nilai maksimum untuk daftar bilangan bulat yang disediakan
- Gunakan kelas ThreadLocalRandom (dari JDK 1.8) untuk menghasilkan nilai bilangan bulat acak terhadap nilai bilangan bulat min dan maks yang ditemukan sebelumnya, lalu filter untuk memastikan bahwa nilai tersebut benar-benar terdapat dalam daftar yang disediakan semula. Akhirnya berlaku berbeda untuk intstream untuk memastikan bahwa nomor yang dihasilkan unik.
Berikut adalah fungsi dengan beberapa deskripsi:
private List<Integer> getUniqueRandomInts(List<Integer> idList, Integer numberToGenerate) {
List<Integer> generatedUniqueIds = new ArrayList<>();
Integer minId = idList.stream().mapToInt (v->v).min().orElseThrow(NoSuchElementException::new);
Integer maxId = idList.stream().mapToInt (v->v).max().orElseThrow(NoSuchElementException::new);
ThreadLocalRandom.current().ints(minId,maxId)
.filter(e->idList.contains(e))
.distinct()
.limit(numberToGenerate)
.forEach(generatedUniqueIds:: add);
return generatedUniqueIds;
}
Sehingga, untuk mendapatkan 11 nomor acak unik untuk objek daftar 'allIntegers', kita akan memanggil fungsi seperti;
List<Integer> ids = getUniqueRandomInts(allIntegers,11);
Fungsi ini mendeklarasikan arrayList baru 'generatedUniqueIds' dan mengisi dengan setiap bilangan bulat acak unik hingga jumlah yang diperlukan sebelum kembali.
Kelas PS ThreadLocalRandom menghindari nilai benih yang sama dalam kasus utas bersamaan.
1..100
(ada algoritme terkenal untuk itu), tetapi berhenti setelah Anda menentukann
elemen pertama .