Bilangan bulat apa yang menurut Anda sesuai truedan falsemasing - masing?
Thorbjørn Ravn Andersen
4
Beberapa bahasa memiliki konversi implisit dari int ke boolean. Java tidak. Namun, implementasi resmi memiliki paket SQL, dan saya percaya ini mengkonversi "false" ke 0.
hpique
4
@Peter Lawrey Tidak jika Anda ingin beroperasi dengan sistem lain yang tidak memiliki boolean sebagai tipe data non-numerik.
hpique
6
@Peter Lawrey Pertanyaannya bukan tentang pemetaan nilai. Ini tentang bagaimana melakukan konversi dengan cara yang paling jelas, diterima.
hpique
7
Secara teknis, kompiler Java sudah mendefinisikan pemetaan. Benar dan Salah dikompilasi menjadi 1 dan 0 masing-masing.
Dalam kasus di mana myBoolean singkatan dari ekspresi boolean, menggunakan tanda kurung lebih mudah dibaca.
rsp
40
Ya, seperti pada (foo && (!bar || baz)) ? 1 : 0. Jelas, jika itu hanya pengenal, parens tidak diperlukan atau diinginkan.
Blrfl
trik yang bagus dengan boolean! Saya sedang mencari mungkin beberapa casting ada seperti (int) true = 1, tetapi mencatat ada seperti ini: P
mumair
1
untuk pemula seperti saya, (boolean expression) ? 1 : 0;akan lebih bisa dimengerti. Saya pikir myawalan membuatnya terlihat seperti variabel.
dixhom
12
@ Blfl dalam tanda kurung Anda adalah suatu keharusan , bukan masalah keterbacaan. foo && (!bar || baz) ? 1 : 0akan menjadi kesalahan sintaksis. (Saya tahu ini sudah 6 tahun)
Menggunakan operator ternary adalah cara paling sederhana, paling efisien, dan paling mudah dibaca untuk melakukan apa yang Anda inginkan. Saya mendorong Anda untuk menggunakan solusi ini.
Namun, saya tidak bisa menolak untuk mengusulkan alternatif, buat, solusi yang tidak efisien, tidak terbaca.
int boolToInt(Boolean b){return b.compareTo(false);}
Hei, orang-orang suka memilih jawaban yang keren!
Edit
Ngomong-ngomong, saya sering melihat konversi dari boolean ke int untuk tujuan tunggal melakukan perbandingan dua nilai (umumnya, dalam implementasi compareTometode). Boolean#compareToadalah cara untuk pergi dalam kasus-kasus khusus itu.
Edit 2
Java 7 memperkenalkan fungsi utilitas baru yang bekerja dengan tipe primitif secara langsung, Boolean#compare(Terima kasih shmosel )
int boolToInt(boolean b){returnBoolean.compare(b,false);}
Akan digariskan oleh JIT modern, jadi belum tentu tidak efisien. Juga mendokumentasikan mengapa b.compareTo digunakan sehingga dapat dibaca.
Thorbjørn Ravn Andersen
2
Ini bisa lambat karena kita perlu mengotakkan nilai primitif dalam suatu objek. Metode operator ternary bekerja secara langsung dengan nilai-nilai primitif tanpa konversi, jadi saya pikir ini lebih efisien.
barjak
5
1. Anda dapat menggunakan Boolean.compare()dan menghindari autoboxing. 2. Dokumentasi untuk Boolean.compareTo()tidak mengatakan itu akan mengembalikan 1, hanya "nilai positif jika objek ini mewakili benar dan argumen mewakili salah".
shmosel
1
Saya baru saja melakukan tes yang mengkonversi 1.000.000 nilai Boolean acak dan metode ini secara konsisten lebih cepat daripada yang didasarkan pada operator ternary. Itu mencukur sekitar 10 ms.
Mapsy
3
@AlexT. jika Anda melakukan microbenchmark Anda harus menggunakan kerangka kerja untuk memastikan bahwa Anda mengukur dengan benar. Lihat openjdk.java.net/projects/code-tools/jmh .
Saya pikir ini akan lebih cocok sebagai komentar, bukan jawaban.
hpique
164
5 - b.toString().length
kennytm
5
@ ThorbjørnRavnAndersen Ya. Menggunakan salah satu dari yang lain, lebih efisien, metode diposting yang tidak memerlukan overhead itu. Kecuali Anda dapat menjelaskan cara membuat objek string untuk sekadar memeriksa nilai boolean dengan cara apa pun yang efisien.
b1nary.atr0phy
10
@ ThorbjørnRavnAndersen Saya tidak memiliki kendali atas bagaimana metode saya digunakan atau seberapa sering mereka dipanggil, yang sepenuhnya merupakan intinya. Anda mengorbankan kinerja dan keterbacaan sama sekali tanpa manfaat nyata.
b1nary.atr0phy
6
Benar-benar kreatif tetapi saya tidak bisa memikirkan satu keuntungan pun untuk menggunakan metode ini. Ini lebih bertele-tele, dan (saya tebak) kurang efisien, tapi itu jelas merupakan metode yang menarik.
Penjelasan : Seperti yang kita ketahui pengembalian default Boolean.compare adalah -1 jika terjadi kecocokan sehingga +1 membuat nilai pengembalian menjadi 0 untuk Falsedan 1 untukTrue
Boolean.compare(myBoolean, false)akan lebih cocok sesuai dengan deskripsi yang dikutip
Vadzim
@ Vadzim Ya memang akan menghasilkan 1 dan 0 dengan membandingkan dengan false dan dalam skenario saat ini akan menghasilkan 0 dan -1. Kedua solusi baik-baik saja dan +1 untuk komentar Anda :-)
mumair
0
Fakta bahwa saya harus menulis metode wrapper di sekitar pernyataan if untuk casting nilai hanya menambah daftar alasan yang sudah sangat besar mengapa java harus sudah mati. Dan melihat operator ternary bahkan tidak dibungkus dalam suatu fungsi tetapi hanya menyalin disisipkan di mana-mana saya melihat pemain boolean ke int hanya membuat saya gila. Ini buang-buang siklus cpu dan penghinaan terhadap pembacaan kode.
Juga sebagian besar jawaban di sini memiliki ratusan upvotes dengan penjelasan nol, yang membuat saya menebak bahwa praktik buruk hanyalah akibat dari terkena java begitu banyak. Jika saya menulis operator ternary untuk casting boolean ke int dalam bahasa modern apa pun, saya akan dipecat pada hari berikutnya dari pekerjaan apa pun yang saya miliki. Jadi hari ini saya sudah berhenti mencoba menggunakan alasan dengan tugas java saya dan memutuskan untuk merangkul kebodohan:
publicstaticint booltoint(boolean nonsense){// Let's start with indenting using spaces, 16 of them to be preciseString[] ____int =newString[500];
____int[0]=Boolean.toString(nonsense);try{Thread.sleep(100);}catch(Exception e){}Random rand =newRandom();int n = rand.nextInt((int)1e9);int result =0;int other_Result =1;for(int i =-5; i <2; i++){try{if(n ==35467247)return5;// let's just fail with one in a billion chanceif((5- ____int[i].length())==1){return++result;}elseif(____int[i]=="false"){return--other_Result;}}catch(Exception e){// This method will throw an exception 5 times every single time I // cast a boolean to int before returning an integer}}return(int)1e35;}
true
danfalse
masing - masing?Jawaban:
^^
PS: true = 1 dan false = 0
sumber
(foo && (!bar || baz)) ? 1 : 0
. Jelas, jika itu hanya pengenal, parens tidak diperlukan atau diinginkan.(boolean expression) ? 1 : 0;
akan lebih bisa dimengerti. Saya pikirmy
awalan membuatnya terlihat seperti variabel.foo && (!bar || baz) ? 1 : 0
akan menjadi kesalahan sintaksis. (Saya tahu ini sudah 6 tahun)sumber
Menggunakan operator ternary adalah cara paling sederhana, paling efisien, dan paling mudah dibaca untuk melakukan apa yang Anda inginkan. Saya mendorong Anda untuk menggunakan solusi ini.
Namun, saya tidak bisa menolak untuk mengusulkan alternatif, buat, solusi yang tidak efisien, tidak terbaca.
Hei, orang-orang suka memilih jawaban yang keren!
Edit
Ngomong-ngomong, saya sering melihat konversi dari boolean ke int untuk tujuan tunggal melakukan perbandingan dua nilai (umumnya, dalam implementasi
compareTo
metode).Boolean#compareTo
adalah cara untuk pergi dalam kasus-kasus khusus itu.Edit 2
Java 7 memperkenalkan fungsi utilitas baru yang bekerja dengan tipe primitif secara langsung,
Boolean#compare
(Terima kasih shmosel )sumber
Boolean.compare()
dan menghindari autoboxing. 2. Dokumentasi untukBoolean.compareTo()
tidak mengatakan itu akan mengembalikan 1, hanya "nilai positif jika objek ini mewakili benar dan argumen mewakili salah".sumber
5 - b.toString().length
sederhana
sumber
sumber
BooleanUtils.toInteger
diimplementasikan sebagai adilreturn bool ? 1 : 0;
.Itu tergantung situasinya. Seringkali pendekatan yang paling sederhana adalah yang terbaik karena mudah dipahami:
atau
Tapi kadang-kadang berguna menggunakan Enum sebagai ganti boolean flag. Bayangkan ada proses sinkron dan asinkron:
Di Jawa, enum dapat memiliki atribut dan metode tambahan:
sumber
?:
adalah Anda bisa meletakkan breakpoint di dalam blok if.Jika Anda menggunakan Apache Commons Lang (yang saya pikir banyak proyek menggunakannya), Anda bisa menggunakannya seperti ini:
toInteger
Metode mengembalikan 1 jikaboolean_expression
benar, 0 sebaliknyasumber
BooleanUtils.toInteger
diimplementasikan sebagai adilreturn bool ? 1 : 0;
.Jika
true -> 1
danfalse -> 0
pemetaan adalah apa yang Anda inginkan, Anda dapat melakukan:sumber
Jika Anda ingin mengaburkan, gunakan ini:
sumber
Mari kita bermain trik
Boolean.compare(boolean, boolean)
. Perilaku fungsi default: jika kedua nilai sama dari itu mengembalikan0
sebaliknya-1
.Penjelasan : Seperti yang kita ketahui pengembalian default Boolean.compare adalah -1 jika terjadi kecocokan sehingga +1 membuat nilai pengembalian menjadi 0 untuk
False
dan 1 untukTrue
sumber
Boolean.compare(myBoolean, false)
akan lebih cocok sesuai dengan deskripsi yang dikutipFakta bahwa saya harus menulis metode wrapper di sekitar pernyataan if untuk casting nilai hanya menambah daftar alasan yang sudah sangat besar mengapa java harus sudah mati. Dan melihat operator ternary bahkan tidak dibungkus dalam suatu fungsi tetapi hanya menyalin disisipkan di mana-mana saya melihat pemain boolean ke int hanya membuat saya gila. Ini buang-buang siklus cpu dan penghinaan terhadap pembacaan kode.
Juga sebagian besar jawaban di sini memiliki ratusan upvotes dengan penjelasan nol, yang membuat saya menebak bahwa praktik buruk hanyalah akibat dari terkena java begitu banyak. Jika saya menulis operator ternary untuk casting boolean ke int dalam bahasa modern apa pun, saya akan dipecat pada hari berikutnya dari pekerjaan apa pun yang saya miliki. Jadi hari ini saya sudah berhenti mencoba menggunakan alasan dengan tugas java saya dan memutuskan untuk merangkul kebodohan:
sumber
Kemudian gunakan:
sumber