Konversi boolean ke int di Jawa


350

Apa cara yang paling diterima untuk mengkonversi booleanke intdi Jawa?


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


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


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);
}

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));

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


24
import org.apache.commons.lang3.BooleanUtils;
boolean x = true;   
int y= BooleanUtils.toInteger(x);

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;
    }
}

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


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.

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

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


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;}

-1
public static int convBool(boolean b)
{
int convBool = 0;
if(b) convBool = 1;
return convBool;
}

Kemudian gunakan:

convBool(aBool);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.