Jaki jest najbardziej akceptowany sposób konwersji boolean
na int
język Java?
Jaki jest najbardziej akceptowany sposób konwersji boolean
na int
język Java?
Odpowiedzi:
int myInt = myBoolean ? 1 : 0;
^^
PS: prawda = 1 i fałsz = 0
(foo && (!bar || baz)) ? 1 : 0
. Oczywiście, jeśli jest to tylko identyfikator, pareny nie są konieczne ani pożądane.
(boolean expression) ? 1 : 0;
byłoby bardziej zrozumiałe. Myślę, że my
przedrostek wyglądał jak zmienna.
foo && (!bar || baz) ? 1 : 0
byłby błąd składniowy. (Wiem, że minęło 6 lat)
Korzystanie z operatora trójskładnikowego jest najprostszym, najbardziej wydajnym i najbardziej czytelnym sposobem na robienie tego, co chcesz. Zachęcam do skorzystania z tego rozwiązania.
Nie mogę się jednak oprzeć zaproponowaniu alternatywnego, przemyślanego, nieefektywnego i nieczytelnego rozwiązania.
int boolToInt(Boolean b) {
return b.compareTo(false);
}
Hej, ludzie lubią głosować na takie fajne odpowiedzi!
Edytować
Nawiasem mówiąc, często widziałem konwersje z wartości logicznej na int wyłącznie w celu porównania dwóch wartości (ogólnie w implementacjach compareTo
metody). Boolean#compareTo
jest właściwą drogą w tych konkretnych przypadkach.
Edytuj 2
Java 7 wprowadziła nową funkcję narzędzia, która działa bezpośrednio z typami pierwotnymi Boolean#compare
(Dzięki shmosel )
int boolToInt(boolean b) {
return Boolean.compare(b, false);
}
Boolean.compare()
i unikać autoboxowania. 2. Dokumentacja dla Boolean.compareTo()
nie mówi, że zwróci 1, a jedynie „wartość dodatnią, jeśli ten obiekt reprezentuje prawda, a argument reprezentuje fałsz”.
boolean b = ....;
int i = -("false".indexOf("" + b));
5 - b.toString().length
import org.apache.commons.lang3.BooleanUtils;
boolean x = true;
int y= BooleanUtils.toInteger(x);
BooleanUtils.toInteger
jest zaimplementowany jako sprawiedliwy return bool ? 1 : 0;
.
To zależy od sytuacji. Często najprostsze podejście jest najlepsze, ponieważ jest łatwe do zrozumienia:
if (something) {
otherThing = 1;
} else {
otherThing = 0;
}
lub
int otherThing = something ? 1 : 0;
Ale czasami warto użyć Enum zamiast flagi boolowskiej. Wyobraźmy sobie, że istnieją procesy synchroniczne i asynchroniczne:
Process process = Process.SYNCHRONOUS;
System.out.println(process.getCode());
W Javie wyliczanie może mieć dodatkowe atrybuty i metody:
public enum Process {
SYNCHRONOUS (0),
ASYNCHRONOUS (1);
private int code;
private Process (int code) {
this.code = code;
}
public int getCode() {
return code;
}
}
?:
jest to, że możesz wstawić punkty przerwania wewnątrz bloków if.
Jeśli używasz Apache Commons Lang (który, jak sądzę, używa go wiele projektów), możesz po prostu użyć go w następujący sposób:
int myInt = BooleanUtils.toInteger(boolean_expression);
toInteger
metoda zwraca 1, jeśli boolean_expression
jest prawdą, 0 w przeciwnym razie
BooleanUtils.toInteger
jest zaimplementowany jako sprawiedliwy return bool ? 1 : 0;
.
Jeśli chcesz zaciemnić, użyj tego:
System.out.println( 1 & Boolean.hashCode( true ) >> 1 ); // 1
System.out.println( 1 & Boolean.hashCode( false ) >> 1 ); // 0
Pozwala zagrać z trikiem Boolean.compare(boolean, boolean)
. Domyślne zachowanie funkcji: jeśli obie wartości są równe, w 0
przeciwnym razie zwraca -1
.
public int valueOf(Boolean flag) {
return Boolean.compare(flag, Boolean.TRUE) + 1;
}
Objaśnienie : Jak wiemy, domyślnym zwróceniem Boolean.compare jest -1 w przypadku niepoprawnego dopasowania, więc +1 ustaw wartość zwracaną na 0 dla False
i 1 dlaTrue
Boolean.compare(myBoolean, false)
lepiej pasowałoby do cytowanego opisu
Fakt, że muszę napisać metodę otoki wokół instrukcji if do rzutowania wartości, dodaje do i tak już ogromnej listy powodów, dla których java powinna po prostu umrzeć. I widząc, że operator trójskładnikowy nie jest nawet zawinięty w funkcję, ale po prostu kopiuje wklejony wszędzie, widzę boolowską obsadę po prostu doprowadza mnie do szału. Jest to strata cykli procesora i zniewaga dla czytelności kodu.
Również większość odpowiedzi tutaj ma setki pozytywnych opinii z zerowym wyjaśnieniem, co sprawia, że zgaduję, że zła praktyka jest tylko wynikiem tak częstego narażenia na java. Gdybym napisał trójskładnikowego operatora do przesyłania wartości logicznej na int w jakimkolwiek współczesnym języku, zostałbym zwolniony następnego dnia z jakiejkolwiek pracy, jaką miałem. Więc dzisiaj zrezygnowałem z prób wykorzystania rozumu przy moich zadaniach java i postanowiłem przyjąć głupotę:
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;}
true
ifalse
odpowiednio?