Jika saya memiliki enum seperti ini:
public enum Letter {
A,
B,
C,
//...
}
Apa cara terbaik untuk memilih satu secara acak? Itu tidak perlu menjadi antipeluru kualitas produksi, tetapi distribusi yang adil akan lebih baik.
Saya bisa melakukan sesuatu seperti ini
private Letter randomLetter() {
int pick = new Random().nextInt(Letter.values().length);
return Letter.values()[pick];
}
Tetapi apakah ada cara yang lebih baik? Saya merasa ini adalah sesuatu yang sudah dipecahkan sebelumnya.
Letter.values()
harus membuat salinan baru dariLetter
array nilai internal .Jawaban:
Satu-satunya hal yang saya sarankan adalah hasil caching
values()
karena setiap panggilan menyalin array. Juga, jangan membuatRandom
setiap waktu. Simpan satu. Selain itu apa yang Anda lakukan baik-baik saja. Begitu:sumber
values()
array ke daftar yang tidak dapat dimodifikasi. TheVALUES
objek sudah dirumuskan berdasarkan yang dinyatakanprivate
. Akan lebih sederhana DAN lebih efisien untuk membuatnyaprivate static final Letter[] VALUES = ...
.Hanya satu metode yang Anda butuhkan untuk semua enum acak Anda:
Yang akan Anda gunakan:
Saya juga lebih suka menggunakan SecureRandom sebagai:
sumber
Menggabungkan saran dari cletus dan helios ,
Sunting: Ups, saya lupa parameter tipe yang dibatasi
<E extends Enum<E>>
,.sumber
E extends Enum<E>
?new RandomEnum<>(Season.class)
diizinkan sejak Java 7.RandomEnum
Kelas tunggal ini akan menyenangkan sebagai perpustakaan mikro, jika Anda ingin menggabungkannya dan menerbitkannya ke pusat.Garis tunggal
sumber
Setuju dengan Stphen C & helios. Cara yang lebih baik untuk mengambil elemen acak dari Enum adalah:
sumber
sumber
Ini mungkin cara paling ringkas untuk mencapai tujuan Anda. Yang perlu Anda lakukan adalah menelepon
Letter.getRandom()
dan Anda akan mendapatkan surat enum acak.sumber
Mungkin paling mudah memiliki fungsi untuk memilih nilai acak dari sebuah array. Ini lebih umum, dan mudah untuk dipanggil.
Sebut seperti ini:
sumber
Di sini versi yang menggunakan shuffle dan stream
sumber
Solusi Kotlin Sederhana
random()
adalah fungsi ekstensi default yang disertakan dalam basis Kotlin padaCollection
objek. Tautan Dokumentasi KotlinJika Anda ingin menyederhanakannya dengan fungsi ekstensi, coba ini:
Untuk membuatnya statis di kelas enum Anda. Pastikan untuk mengimpor
my.package.random
file enum AndaJika Anda perlu melakukannya dari instance enum, coba ekstensi ini
sumber
Jika Anda melakukan ini untuk pengujian, Anda dapat menggunakan Quickcheck ( ini adalah port Java yang telah saya kerjakan ).
Ini mendukung semua jenis primitif, komposisi jenis, koleksi, fungsi distribusi yang berbeda, batas dll. Ini memiliki dukungan untuk pelari yang menjalankan beberapa nilai:
Keuntungan Quickcheck adalah Anda dapat menentukan tes berdasarkan spesifikasi tempat TDD biasa bekerja dengan skenario.
sumber
Lebih mudah untuk mengimplementasikan fungsi acak pada enum.
dan kemudian Anda menyebutnya dari kelas yang Anda butuhkan seperti ini
sumber
Saya akan menggunakan ini:
sumber
Saya kira metode pengembalian satu-baris ini cukup efisien untuk digunakan dalam pekerjaan yang begitu sederhana:
sumber