Java'da boolean işlevini int biçimine dönüştür


350

Bir dönüştürmek için en kabul yolu nedir booleanbir etmek intJava?


8
Ne tamsayılar Eğer karşılık düşünebilirdi trueve falsesırasıyla?
Thorbjørn Ravn Andersen

5
Bazı diller int'den boole'ye örtük dönüşüme sahiptir. Java bunu yapmaz. Ancak, resmi uygulama SQL paketleri vardır ve ben bu "yanlış" 0 dönüştürmek inanıyorum
hpique

4
@Peter Lawrey Sayısal olmayan bir veri türü olarak mantıksal olmayan diğer sistemlerle birlikte çalışmak istiyorsanız değil.
hpique

6
@Peter Lawrey Soru aslında değer haritalamasıyla ilgili değil. Dönüşümün en açık, kabul edilen bir şekilde nasıl yapılacağı ile ilgilidir.
hpique

8
Teknik olarak, Java derleyicisi zaten bir eşleme tanımlar. Doğru ve Yanlış sırasıyla 1 ve 0 olarak derlenir.
Antimon

Yanıtlar:


583
int myInt = myBoolean ? 1 : 0;

^^

PS: true = 1 ve false = 0


59
MyBoolean'ın bir boole ifadesini temsil ettiği durumda, parantez kullanımı daha okunabilir.
rsp

40
Evet, olduğu gibi (foo && (!bar || baz)) ? 1 : 0. Açıkçası, eğer sadece bir tanımlayıcı ise, parenler gerekli veya arzu edilmez.
Blrfl

boolean ile güzel hile! Ben (int) true = 1 gibi bazı döküm var olabilir, ama böyle olduğunu belirterek
bakıyordu

1
benim gibi yeni başlayanlar (boolean expression) ? 1 : 0;için daha anlaşılır olurdu. Bence myönek bir değişken gibi görünüyordu.
dixhom

12
Örnek parantezinizdeki @Blrfl , okunabilirlik meselesi değil , bir zorunluluktur . foo && (!bar || baz) ? 1 : 0sözdizimi hatası olur. (6 yıl olduğunu biliyorum)
Konrad Morawski


59

Üçlü operatörü kullanmak, istediğiniz şeyi yapmanın en basit, en verimli ve en okunabilir yoludur. Bu çözümü kullanmanızı öneririm.

Ancak, alternatif, tutarlı, verimsiz, okunamayan bir çözüm önermeye dayanamıyorum.

int boolToInt(Boolean b) {
    return b.compareTo(false);
}

Hey, insanlar böyle havalı cevaplara oy vermek ister!

Düzenle

Bu arada, genellikle iki değerin (genellikle compareToyöntem uygulamalarında ) karşılaştırılması amacıyla bir boole'den int'e dönüşümler gördüm . Boolean#compareTobu özel durumlarda gitmenin yolu.

Düzenle 2

Java 7 doğrudan ilkel tiplerle çalışan yeni bir yardımcı program işlevi sundu Boolean#compare(Teşekkürler shmosel )

int boolToInt(boolean b) {
    return Boolean.compare(b, false);
}

1
Modern JIT'ler tarafından vurgulanacaktır, bu yüzden mutlaka verimsiz değildir. Ayrıca, b.compareTo öğesinin neden okunabildiğini ve dolayısıyla okunabildiğini belgeler.
Thorbjørn Ravn Andersen

2
Yavaş olabilir, çünkü bir nesnedeki ilkel değeri kutlamamız gerekir. Üçlü operatör yöntemi, dönüşüm olmadan doğrudan ilkel değerlerle çalışır, bu yüzden daha verimli olduğunu düşünüyorum.
barjak

5
1. Boolean.compare()Otomatik boksu kullanabilir ve bunlardan kaçınabilirsiniz. 2. için dokümantasyon Boolean.compareTo()1 döndüreceğini söylemez, sadece "bu nesne true değerini temsil ediyorsa ve argüman false değerini temsil ediyorsa pozitif bir değerdir".
shmosel

1
1.000.000 rastgele Boole değerini dönüştüren bir test yaptım ve bu yöntem üçlü operatöre dayalı olandan sürekli olarak daha hızlıydı. Yaklaşık 10 ms tıraş oldu.
Mapsy

3
@AlexT. mikrobenmarklar yaparsanız, doğru ölçüm yaptığınızdan emin olmak için bir çerçeve kullanmalısınız. Bkz. Openjdk.java.net/projects/code-tools/jmh .
Thorbjørn Ravn Andersen

48
boolean b = ....; 
int i = -("false".indexOf("" + b));

14
Bunun bir cevap olarak değil, yorum olarak daha uygun olacağını düşünüyorum.
hpique

164
5 - b.toString().length
kennytm

5
@ ThorbjørnRavnAndersen Evet. Bu yükü gerektirmeyen diğer, daha verimli yöntemlerden birini kullanmak. Bir booleanın değerini kontrol etmek için dize nesneleri oluşturmanın herhangi bir şekilde verimli olduğunu nasıl açıklayamazsanız.
b1nary.atr0phy

10
@ ThorbjørnRavnAndersen Yöntemlerimin nasıl kullanıldığı veya ne sıklıkta çağrıldıkları üzerinde hiçbir kontrole sahip değilim. Kesinlikle hiçbir somut fayda için hem performansı hem de okunabilirliği feda ediyorsunuz.
b1nary.atr0phy

6
Kesinlikle yaratıcı ama bu yöntemi kullanmak için tek bir avantaj düşünemiyorum. Daha ayrıntılı ve (daha az tahmin ediyorum) daha az verimli, ama kesinlikle ilginç bir yöntem.
Mike Baxter

27
public int boolToInt(boolean b) {
    return b ? 1 : 0;
}

basit


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

FWIW, BooleanUtils.toIntegertam olarak uygulanmaktadır return bool ? 1 : 0;.
Solomon Ucko

Apache Commons yararlı olabilir, ancak bu sadece saçma.
Eric Duminil

14

Bu duruma bağlıdır. Genellikle en basit yaklaşım en iyisidir çünkü anlaşılması kolaydır:

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

veya

int otherThing = something ? 1 : 0;

Ancak bazen boolean bayrağı yerine bir Enum kullanmak yararlı olur. Senkronize ve senkronize olmayan süreçler olduğunu hayal edelim:

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

Java'da enum'un ek özellikleri ve yöntemleri olabilir:

public enum Process {

    SYNCHRONOUS (0),
    ASYNCHRONOUS (1);

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

    public int getCode() {
        return code;
    }
}

6
İf yerine kullanmanın bir başka nedeni ?:if bloklarının içine kesme noktaları koyabilmenizdir.
Thorbjørn Ravn Andersen

12

Eğer kullanırsanız Apache Commons Lang (Ben projelerde bir sürü kullanmak düşünüyorum), sadece bu gibi kullanabilirsiniz:

int myInt = BooleanUtils.toInteger(boolean_expression); 

toIntegeryöntem boolean_expressiondoğruysa 1 , aksi takdirde 0 döndürür


FWIW, BooleanUtils.toIntegertam olarak uygulanmaktadır return bool ? 1 : 0;.
Solomon Ucko

8

Eğer true -> 1ve false -> 0haritalama istediğini, sen yapabilirsiniz:

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

6

Gizlemek istiyorsanız, şunu kullanın:

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

3

İle hile oynayalım Boolean.compare(boolean, boolean). Fonksiyonun varsayılan davranışı: her iki değer de eşitse, 0aksi takdirde döner -1.

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

Açıklama : Bildiğimiz gibi, yanlış eşleşme durumunda Boolean.compare öğesinin varsayılan getirisi -1'dir, bu nedenle +1 dönüş değerini 0 için Falseve 1 içinTrue


3
Boolean.compare(myBoolean, false)alıntı açıklamaya göre daha uygun
Vadzim

@Vadzim Evet, aslında false ile karşılaştırılarak 1 ve 0 üretecek ve mevcut senaryoda 0 ve -1 üretecektir. Her iki çözüm de iyi ve yorumunuz için +1 :-)
mumair

0

Bir değer dökümü için bir if ifadesinin etrafına bir sarmalayıcı yöntemi yazmak zorunda olduğum gerçeği, java'nın zaten ölmesi gereken nedenlerin zaten büyük listesine ekliyor. Üçlü operatörün bir fonksiyona sarılmadığını, ancak her yere yapıştırıldığını görmek, int'e bir boolean döküm görüyorum. İşlemci döngüsü kaybı ve kod okunabilirliği için hakaret.

Ayrıca, buradaki cevapların çoğunda sıfır açıklamalı yüzlerce oylama var, bu da kötü uygulamanın java'ya çok fazla maruz kalmanın bir sonucu olduğunu tahmin etmemi sağlıyor. Eğer herhangi bir modern dilde boole çevirmek için üçlü bir operatör yazsaydım, ertesi gün sahip olduğum işten kovulurdum. Bu yüzden bugün java görevlerimle akıl yürütmeye çalışmaktan vazgeçtim ve aptallığı kucaklamaya karar verdim:

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

Sonra kullan :

convBool(aBool);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.