Konvertieren Sie Boolesche Werte in Java in int

350

Was ist der am meisten akzeptierte Art und Weise ein zu konvertieren , booleanum einen intin Java?

hpique
quelle
8
Welche Zahlen würden Sie denken , entsprechen trueund falsejeweils?
Thorbjørn Ravn Andersen
4
Einige Sprachen haben eine implizite Konvertierung von int nach boolean. Java nicht. Die offizielle Implementierung enthält jedoch SQL-Pakete, und ich glaube, diese konvertieren "false" in 0.
hpique
4
@Peter Lawrey Nicht, wenn Sie mit anderen Systemen zusammenarbeiten möchten, die keinen Booleschen Wert als nicht numerischen Datentyp haben.
Hpique
6
@ Peter Lawrey Die Frage bezieht sich nicht wirklich auf die Wertzuordnung. Es geht darum, wie die Konvertierung auf die klarste und akzeptierteste Weise durchgeführt wird.
Hpique
7
Technisch definiert der Java-Compiler bereits ein Mapping. True und False werden zu 1 bzw. 0 kompiliert.
Antimon

Antworten:

583
int myInt = myBoolean ? 1 : 0;

^^

PS: wahr = 1 und falsch = 0

Jonatha ANTOINE
quelle
59
In dem Fall, in dem myBoolean für einen booleschen Ausdruck steht, ist die Verwendung von Klammern besser lesbar.
rsp
40
Ja wie in (foo && (!bar || baz)) ? 1 : 0. Wenn es sich nur um eine Kennung handelt, sind die Parens offensichtlich nicht notwendig oder wünschenswert.
Blrfl
schöner Trick mit Boolean! Ich habe gesucht, dass vielleicht ein Casting wie (int) true = 1 existiert, aber es gibt folgende
Hinweise
1
Für Anfänger wie mich (boolean expression) ? 1 : 0;wäre das verständlicher. Ich denke, das myPräfix hat es wie eine Variable aussehen lassen.
Dixhom
12
@Blrfl in Ihren Beispielklammern ist ein Muss , keine Frage der Lesbarkeit. foo && (!bar || baz) ? 1 : 0wäre ein Syntaxfehler. (Ich weiß, es ist 6 Jahre her)
Konrad Morawski
150
int val = b? 1 : 0;
Grodriguez
quelle
perfekte Antwort!
Gaurav
59

Die Verwendung des ternären Operators ist die einfachste, effizienteste und am besten lesbare Methode, um das zu tun, was Sie möchten. Ich ermutige Sie, diese Lösung zu verwenden.

Ich kann jedoch nicht widerstehen, eine alternative, erfundene, ineffiziente und unlesbare Lösung vorzuschlagen.

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

Hey, die Leute stimmen gerne für so coole Antworten!

Bearbeiten

Übrigens habe ich oft Konvertierungen von einem Booleschen in einen Int gesehen, um einen Vergleich der beiden Werte durchzuführen (im Allgemeinen bei Implementierungen von compareToMethoden). Boolean#compareToist der richtige Weg in diesen speziellen Fällen.

Bearbeiten 2

Java 7 hat eine neue Dienstprogrammfunktion eingeführt, die direkt mit primitiven Typen arbeitet Boolean#compare(Danke shmosel ).

int boolToInt(boolean b) {
    return Boolean.compare(b, false);
}
Barjak
quelle
1
Wird von modernen JITs eingefügt, also nicht unbedingt ineffizient. Außerdem wird dokumentiert, warum b.compareTo verwendet wird, damit es lesbar ist.
Thorbjørn Ravn Andersen
2
Es kann langsam sein, weil wir den primitiven Wert in ein Objekt einfügen müssen. Die ternäre Operatormethode arbeitet direkt mit primitiven Werten ohne Konvertierung, daher denke ich, dass sie effizienter ist.
Barjak
5
1. Sie können Boolean.compare()das Autoboxing verwenden und vermeiden. 2. Die Dokumentation für Boolean.compareTo()gibt nicht an, dass 1 zurückgegeben wird, sondern nur "ein positiver Wert, wenn dieses Objekt wahr und das Argument falsch darstellt".
Shmosel
1
Ich habe gerade einen Test durchgeführt, bei dem 1.000.000 zufällige Boolesche Werte konvertiert wurden, und diese Methode war durchweg schneller als die auf dem ternären Operator basierende. Es rasierte sich etwa 10 ms ab.
Mapsy
3
@AlexT. Wenn Sie Mikrobenchmarks verwenden, sollten Sie ein Framework verwenden, um sicherzustellen, dass Sie richtig messen. Siehe openjdk.java.net/projects/code-tools/jmh .
Thorbjørn Ravn Andersen
48
boolean b = ....; 
int i = -("false".indexOf("" + b));
Thorbjørn Ravn Andersen
quelle
14
Ich denke, dies wäre besser als Kommentar geeignet, nicht als Antwort.
Hpique
164
5 - b.toString().length
Kennytm
5
@ ThorbjørnRavnAndersen Ja. Verwenden Sie eine der anderen, effizienteren Methoden, für die dieser Overhead nicht erforderlich ist. Es sei denn, Sie können erklären, wie das Erstellen von Zeichenfolgenobjekten zum einfachen Überprüfen des Werts eines Booleschen Werts in irgendeiner Weise effizient ist.
b1nary.atr0phy
10
@ ThorbjørnRavnAndersen Ich habe keine Kontrolle darüber, wie meine Methoden verwendet werden oder wie oft sie aufgerufen werden, worum es ganz geht. Sie opfern sowohl Leistung als auch Lesbarkeit für absolut keinen greifbaren Nutzen.
b1nary.atr0phy
6
Es ist definitiv kreativ, aber ich kann mir keinen einzigen Vorteil vorstellen, wenn ich diese Methode verwende. Es ist ausführlicher und (ich vermute) weniger effizient, aber es ist sicher eine interessante Methode.
Mike Baxter
27
public int boolToInt(boolean b) {
    return b ? 1 : 0;
}

einfach

Adam
quelle
24
import org.apache.commons.lang3.BooleanUtils;
boolean x = true;   
int y= BooleanUtils.toInteger(x);
Darkeniel
quelle
FWIW BooleanUtils.toIntegerwird als gerecht implementiert return bool ? 1 : 0;.
Solomon Ucko
Apache Commons kann nützlich sein, aber das ist einfach lächerlich.
Eric Duminil
14

Das hängt von der Situation ab. Oft ist der einfachste Ansatz der beste, weil er leicht zu verstehen ist:

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

oder

int otherThing = something ? 1 : 0;

Aber manchmal ist es nützlich, eine Aufzählung anstelle eines booleschen Flags zu verwenden. Stellen Sie sich vor, es gibt synchrone und asynchrone Prozesse:

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

In Java kann enum zusätzliche Attribute und Methoden haben:

public enum Process {

    SYNCHRONOUS (0),
    ASYNCHRONOUS (1);

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

    public int getCode() {
        return code;
    }
}
Hendrik Brummermann
quelle
6
Ein weiterer Grund für die Verwendung eines if anstelle von ?:ist, dass Sie Haltepunkte in die if-Blöcke einfügen können.
Thorbjørn Ravn Andersen
12

Wenn Sie Apache Commons Lang verwenden (was meiner Meinung nach in vielen Projekten verwendet wird), können Sie es einfach so verwenden:

int myInt = BooleanUtils.toInteger(boolean_expression); 

toIntegerMethode gibt 1 zurück, wenn boolean_expressiontrue, andernfalls 0

triForce420
quelle
FWIW BooleanUtils.toIntegerwird als gerecht implementiert return bool ? 1 : 0;.
Solomon Ucko
8

Wenn true -> 1und false -> 0Mapping das ist, was Sie wollen, können Sie Folgendes tun:

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

Wenn Sie verschleiern möchten, verwenden Sie Folgendes:

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

Lass uns einen Streich spielen Boolean.compare(boolean, boolean). Standardverhalten der Funktion: Wenn beide Werte gleich sind, wird 0nichts anderes zurückgegeben -1.

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

Erläuterung : Wie wir wissen, ist die Standardrückgabe von Boolean.compare im Falle einer Fehlanpassung -1, sodass +1 den Rückgabewert auf 0 für Falseund 1 für setztTrue

mumair
quelle
3
Boolean.compare(myBoolean, false)würde besser zu der zitierten Beschreibung passen
Vadzim
@Vadzim Ja, tatsächlich werden 1 und 0 durch Vergleich mit false generiert, und im aktuellen Szenario werden 0 und -1 generiert. Beide Lösungen sind in Ordnung und +1 für Ihren Kommentar :-)
mumair
0

Die Tatsache, dass ich eine Wrapper-Methode um eine if-Anweisung zum Umwandeln eines Werts schreiben muss, trägt nur zu der bereits riesigen Liste von Gründen bei, warum Java einfach schon sterben sollte. Und wenn ich sehe, dass der ternäre Operator nicht einmal in eine Funktion eingeschlossen ist, sondern nur überall kopiert wird, sehe ich eine boolesche Umwandlung in int, die mich nur verrückt macht. Es ist eine Verschwendung von CPU-Zyklen und eine Beleidigung der Lesbarkeit des Codes.

Außerdem haben die meisten Antworten hier Hunderte von Upvotes ohne Erklärung, was mich vermuten lässt, dass schlechte Praktiken nur darauf zurückzuführen sind, dass man so viel Java ausgesetzt ist. Wenn ich einen ternären Operator schreiben würde, um Boolesche Werte in einer modernen Sprache in int umzuwandeln, würde ich am nächsten Tag von jedem Job entlassen, den ich haben könnte. Deshalb habe ich heute aufgegeben, Vernunft für meine Java-Aufgaben einzusetzen, und mich entschlossen, Dummheit anzunehmen:

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
quelle
-1
public static int convBool(boolean b)
{
int convBool = 0;
if(b) convBool = 1;
return convBool;
}

Dann benutze :

convBool(aBool);
Regis_AG
quelle