Konversi boolean ke int di Jawa

350

Apa cara yang paling diterima untuk mengkonversi booleanke intdi Jawa?

hpique
sumber
8
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.
Antimony

Jawaban:

583
int myInt = myBoolean ? 1 : 0;

^^

PS: true = 1 dan false = 0

Jonatha ANTOINE
sumber
59
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)
Konrad Morawski
150
int val = b? 1 : 0;
Grodriguez
sumber
jawaban sempurna!
gaurav
59

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) {
    return Boolean.compare(b, false);
}
barjak
sumber
1
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 .
Thorbjørn Ravn Andersen
48
boolean b = ....; 
int i = -("false".indexOf("" + b));
Thorbjørn Ravn Andersen
sumber
14
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.
Mike Baxter
27
public int boolToInt(boolean b) {
    return b ? 1 : 0;
}

sederhana

Adam
sumber
24
import org.apache.commons.lang3.BooleanUtils;
boolean x = true;   
int y= BooleanUtils.toInteger(x);
Darkeniel
sumber
FWIW, BooleanUtils.toIntegerdiimplementasikan sebagai adil return bool ? 1 : 0;.
Solomon Ucko
Apache Commons bisa berguna, tetapi ini hanya konyol.
Eric Duminil
14

Itu tergantung situasinya. Seringkali pendekatan yang paling sederhana adalah yang terbaik karena mudah dipahami:

if (something) {
    otherThing = 1;
} else {
    otherThing = 0;
}

atau

int otherThing = something ? 1 : 0;

Tapi kadang-kadang berguna menggunakan Enum sebagai ganti boolean flag. Bayangkan ada proses sinkron dan asinkron:

Process process = Process.SYNCHRONOUS;
System.out.println(process.getCode());

Di Jawa, enum dapat memiliki atribut dan metode tambahan:

public enum Process {

    SYNCHRONOUS (0),
    ASYNCHRONOUS (1);

    private int code;
    private Process (int code) {
        this.code = code;
    }

    public int getCode() {
        return code;
    }
}
Hendrik Brummermann
sumber
6
Alasan tambahan untuk menggunakan if jika bukan ?:adalah Anda bisa meletakkan breakpoint di dalam blok if.
Thorbjørn Ravn Andersen
12

Jika Anda menggunakan Apache Commons Lang (yang saya pikir banyak proyek menggunakannya), Anda bisa menggunakannya seperti ini:

int myInt = BooleanUtils.toInteger(boolean_expression); 

toIntegerMetode mengembalikan 1 jika boolean_expressionbenar, 0 sebaliknya

triForce420
sumber
FWIW, BooleanUtils.toIntegerdiimplementasikan sebagai adil return bool ? 1 : 0;.
Solomon Ucko
8

Jika true -> 1dan false -> 0pemetaan adalah apa yang Anda inginkan, Anda dapat melakukan:

boolean b = true;
int i = b ? 1 : 0; // assigns 1 to i.
codaddict
sumber
6

Jika Anda ingin mengaburkan, gunakan ini:

System.out.println( 1 & Boolean.hashCode( true ) >> 1 );  // 1
System.out.println( 1 & Boolean.hashCode( false ) >> 1 ); // 0
Christian Ullenboom
sumber
3

Mari kita bermain trik Boolean.compare(boolean, boolean). Perilaku fungsi default: jika kedua nilai sama dari itu mengembalikan 0sebaliknya -1.

public int valueOf(Boolean flag) {
   return Boolean.compare(flag, Boolean.TRUE) + 1;
}

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

mumair
sumber
3
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:

public static int booltoint(boolean nonsense) {
                                // Let's start with indenting using spaces, 16 of them to be precise
                                String[] ____int = new String[500];
                                ____int[0] = Boolean.toString(nonsense);
                                try {
                                                Thread.sleep(100); 
                                } catch (Exception e) {    }
                                Random rand = new Random();
                                int n = rand.nextInt((int)1e9);
                                int result = 0;
                                int other_Result = 1;
                                for (int i = -5; i < 2; i++) {
                                                try {
                                                                if (n == 35467247) return 5; // let's just fail with one in a billion chance
                                                                if ((5 - ____int[i].length()) == 1) {
                                                                                return ++result;
                                                                } else if(____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;}
MuhsinFatih
sumber
-1
public static int convBool(boolean b)
{
int convBool = 0;
if(b) convBool = 1;
return convBool;
}

Kemudian gunakan:

convBool(aBool);
Regis_AG
sumber