Перетворити boolean в int в Java


350

Який найприйнятніший спосіб перетворити booleanна intв Java?


8
Яким цілим числу, на вашу думку, відповідали trueі falseвідповідно?
Thorbjørn Ravn Andersen

4
Деякі мови мають неявну конверсію від int до boolean. Java не робить. Однак офіційна реалізація має пакети SQL, і я вважаю, що вони перетворюють "помилкові" на 0.
hpique

4
@Peter Lawrey Ні, якщо ви хочете взаємодіяти з іншими системами, які не мають булевого типу як нечисловий тип даних.
hpique

6
@Peter Lawrey Питання не в тому, що стосується відображення значення. Йдеться про те, як зробити перетворення найбільш зрозумілим, прийнятим способом.
hpique

7
Технічно компілятор Java вже визначає відображення. True та False складаються відповідно до 1 та 0.
Сурма

Відповіді:


583
int myInt = myBoolean ? 1 : 0;

^^

PS: true = 1 і false = 0


59
У випадку, коли myBoolean означає булевий вираз, використання дужок є більш читабельним.
rsp

40
Так, як в (foo && (!bar || baz)) ? 1 : 0. Очевидно, що якщо це просто ідентифікатор, паролі не потрібні чи бажані.
Blrfl

приємний трюк з булевим! Я шукав, чи можуть існувати кастинги на зразок (int) true = 1, але зауважую, існують так: P
mumair

1
для початківців, як я, (boolean expression) ? 1 : 0;було б зрозуміліше. Я думаю, що myпрефікс зробив це схожим на змінну.
dixhom

12
@Blrfl у вашому прикладі круглих дужок є обов'язковим , а не питанням читабельності. foo && (!bar || baz) ? 1 : 0була б синтаксичною помилкою. (Я знаю, що минуло 6 років)
Конрад Моравський


59

Використання потрійного оператора - це найпростіший, найефективніший і найчитабельніший спосіб зробити те, що ви хочете. Я закликаю вас використовувати це рішення.

Однак я не можу противитися запропонувати альтернативне, надумане, неефективне, нечитабельне рішення.

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

Гей, люди люблять голосувати за такі класні відповіді!

Редагувати

До речі, я часто бачив перетворення булевого в int з єдиною метою порівняння двох значень (як правило, в реалізаціях compareToметоду). Boolean#compareToце шлях у тих конкретних випадках.

Редагувати 2

Java 7 представила нову функціональну програму, яка безпосередньо працює з примітивними типами Boolean#compare(спасибі shmosel )

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

1
Буде підкреслено сучасними JIT, тому не обов'язково неефективним. Також він документує, чому b.compareTo використовується, щоб він був читабельним.
Thorbjørn Ravn Andersen

2
Це може бути повільним, оскільки нам потрібно встановити примітивні значення в об'єкті. Метод потрійного оператора працює безпосередньо з примітивними значеннями без перетворення, тому я думаю, що це більш ефективно.
barjak

5
1. Ви можете використовувати Boolean.compare()та уникати автобоксингу. 2. Документація для Boolean.compareTo()не говорить про те, що вона поверне 1, лише "позитивне значення, якщо цей об'єкт є істинним, а аргумент представляє помилкове".
шмосель

1
Я щойно робив тест, перетворюючи 1 000 000 випадкових булевих значень, і цей метод був постійно швидшим, ніж метод, заснований на потрійному операторі. Він поголився близько 10мс.
Mapsy

3
@AlexT. якщо ви робите мікробірки, вам слід використовувати рамку, щоб переконатися, що ви правильно вимірюєте. Дивіться openjdk.java.net/projects/code-tools/jmh .
Thorbjørn Ravn Andersen

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

14
Я думаю, що це краще підходить як коментар, а не відповідь.
hpique

164
5 - b.toString().length
kennytm

5
@ ThorbjørnRavnAndersen Так. Використовуючи один з інших, більш ефективних, опублікованих методів, які не вимагають накладних витрат. Якщо ви не можете пояснити, як створення рядкових об'єктів для простої перевірки значення булевого будь-якого способу ефективно.
b1nary.atr0phy

10
@ ThorbjørnRavnAndersen Я не маю контролю над тим, як використовуються мої методи або як часто вони викликаються, що цілком суть. Ви жертвуєте як продуктивністю, так і читальністю за абсолютно ніяку відчутну користь.
b1nary.atr0phy

6
Це безумовно творче, але я не можу придумати жодної переваги використання цього методу. Це більш багатослівний і (гадаю) менш ефективний, але це, звичайно, цікавий метод.
Майк Бакстер



14

Це залежить від ситуації. Найчастіше найпростіший підхід найкращий, тому що його легко зрозуміти:

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

або

int otherThing = something ? 1 : 0;

Але іноді корисно використовувати Enum замість булевого прапора. Уявімо собі, що існують синхронні та асинхронні процеси:

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

У Java enum може мати додаткові атрибути та методи:

public enum Process {

    SYNCHRONOUS (0),
    ASYNCHRONOUS (1);

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

    public int getCode() {
        return code;
    }
}

6
Додатковою причиною використання параметра if замість того ?:, що ви можете ставити точки прориву всередині блоків if.
Thorbjørn Ravn Andersen

12

Якщо ви використовуєте Apache Commons Lang (на мою думку, багато проектів використовують його), ви можете просто використовувати його так:

int myInt = BooleanUtils.toInteger(boolean_expression); 

toIntegerметод повертає 1, якщо boolean_expressionвірно, 0 в іншому випадку


FWIW, BooleanUtils.toIntegerреалізується як раз return bool ? 1 : 0;.
Соломон Учко


6

Якщо ви хочете облудити, скористайтеся цим:

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

3

Давайте грати з фокусом Boolean.compare(boolean, boolean). Поведінка функції за замовчуванням: якщо обидва значення рівні, ніж це повертається в 0іншому випадку -1.

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

Пояснення : Як відомо, повернення Boolean.compare за замовчуванням становить -1 у разі невідповідності, тому +1 зробить повернене значення 0 для Falseта 1 дляTrue


3
Boolean.compare(myBoolean, false)підходили б краще за цитованим описом
Вадим

@Vadzim Так дійсно буде генерувати 1 і 0, порівнюючи з помилковими, і в поточному сценарії він генерує 0 і -1. Обидва рішення чудово і +1 для вашого коментаря :-)
mumair

0

Той факт, що мені доводиться писати метод обгортки навколо параметра if, якщо для перерахування значення, просто додає до вже величезного списку причин, чому ява повинен просто померти. І бачачи, що потрійний оператор навіть не завершений у функцію, а просто копіюється скріплено скрізь, я бачу булевий відступ до int, просто приводить мене в горіхи. Це марність циклів процесора та образа читабельності коду.

Крім того, більшість відповідей тут мають сотні оновлень з нульовим поясненням, що змушує мене гадати, що погана практика - це лише результат того, що ява так сильно піддається впливу. Якби я написав потрійного оператора, який давав бити бул до int будь-якою сучасною мовою, мене звільнять наступного дня з будь-якої роботи, яка б у мене була. Тож сьогодні я відмовився намагатися використовувати розум у своїх завданнях Java і вирішив прийняти дурість:

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

Потім використовуйте:

convBool(aBool);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.