Javaでブール値をintに変換する


350

変換する最も受け入れ方法は何であるbooleanintJavaで?


8
どの整数に対応するtrueと思いますfalseか?
するThorbjörnRavnアンデルセン

4
一部の言語には、intからbooleanへの暗黙の変換があります。Javaにはありません。しかし、公式の実装では、SQLパッケージを持っている、と私は0にこれらの変換「偽」を信じて
hpique

4
@Peter Lawrey非数値データ型としてブール値を持たない他のシステムと相互運用したい場合はそうではありません。
hpique

6
@Peter Lawrey問題は、値のマッピングに関するものではありません。最も明確で受け入れられた方法で変換を行う方法についてです。
hpique

7
技術的には、Javaコンパイラはすでにマッピングを定義しています。TrueとFalseは、それぞれ1と0にコンパイルされます。
アンチモン2012

回答:


583
int myInt = myBoolean ? 1 : 0;

^^

PS:true = 1およびfalse = 0


59
myBooleanがブール式を表す場合、括弧を使用すると読みやすくなります。
rsp 09/10 / 25、12:

40
はい、のように(foo && (!bar || baz)) ? 1 : 0。明らかに、それが単なる識別子である場合、括弧は不要または望ましいものではありません。
Blrfl

ブール値で素敵なトリック!(int)true = 1のようにいくつかのキャストが存在する可能性があるのを探していましたが、次のように存在していることに注意してください:P
mumair

1
私のような初心者にとっては、(boolean expression) ? 1 : 0;より理解しやすいでしょう。my接頭辞によって変数のように見えたと思います。
dixhom 2016年

12
括弧内の@Blrflは必須であり、読みやすさの問題ではありませんfoo && (!bar || baz) ? 1 : 0構文エラーになります。(私はそれが6年になったことを知っています)
Konrad Morawski


59

三項演算子の使用は、必要なことを行うための最も単純で、最も効率的で、最も読みやすい方法です。このソリューションを使用することをお勧めします。

しかし、私は代替の、工夫された、非効率的な、読み取り不可能なソリューションを提案することに抵抗することはできません。

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

ねえ、人々はそのようなクールな答えに投票するのが好きです!

編集する

ちなみに、2つの値を比較することを唯一の目的として(通常、compareToメソッドの実装で)、ブール値からintへの変換をよく見ました。Boolean#compareToこれらの特定の場合に行く方法です。

編集2

Java 7は、プリミティブ型を直接操作する新しいユーティリティ関数を導入しましたBoolean#compareshmoselに感謝)

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

1
最新のJITによってインライン化されるため、必ずしも非効率的ではありません。また、読みやすいようにb.compareToが使用されている理由についても説明します。
するThorbjörnRavnアンデルセン

2
オブジェクトのプリミティブ値をボックス化する必要があるため、遅くなる可能性があります。三項演算子メソッドは、変換せずにプリミティブ値を直接処理するので、より効率的だと思います。
Barjak 2011

5
1. Boolean.compare()オートボクシングを使用および回避できます。2.のドキュメントでBoolean.compareTo()は、「1が返される」とは述べられていません。「このオブジェクトがtrueを表し、引数がfalseを表す場合、正の値」のみです。
shmosel 2014年

1
1,000,000のランダムなブール値を変換するテストを実行したところ、この方法は3項演算子に基づく方法よりも一貫して高速でした。それは約10msを削った。
Mapsy 2014年

3
@AlexT。マイクロベンチマークを行う場合は、フレームワークを使用して正しく測定できるようにする必要があります。openjdk.java.net/projects/code-tools/jmhを参照してください。
するThorbjörnRavnアンデルセン

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

14
これは答えではなくコメントとして適していると思います。
hpique

164
5 - b.toString().length
kennytm

5
@ThorbjørnRavnAndersenうん。オーバーヘッドを必要としない、他のより効率的なメソッドの1つを使用して投稿します。ブール値を単にチェックするための文字列オブジェクトの作成がどのようにして効率的であるかを説明できない限り。
b1nary.atr0phy 2013年

10
@ThorbjørnRavnAndersen私は自分のメソッドの使用方法やそれらが呼び出される頻度を制御できません。それが完全にポイントです。目に見える利点がまったくないために、パフォーマンスと可読性の両方を犠牲にしている。
b1nary.atr0phy 2013年

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では、列挙型は追加の属性とメソッドを持つことができます。

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を使用するもう1つの理由は?:、ifブロック内にブレークポイントを配置できることです。
するThorbjörnRavnアンデルセン

12

あなたが使用している場合はApache Commonsのラング(私はプロジェクトの多くはそれを使用すると思います)、あなたはちょうどこのようにそれを使用することができます:

int myInt = BooleanUtils.toInteger(boolean_expression); 

toIntegerメソッドboolean_expressionは、trueの場合は1を返し、それ以外の場合は0を返します。


FWIWは、BooleanUtils.toIntegerとして実装されていreturn bool ? 1 : 0;ます。
ソロモンウッコ

8

場合true -> 1false -> 0マッピングが何をしたいです、あなたが行うことができます。

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


3

とトリックをしましょうBoolean.compare(boolean, boolean)。関数のデフォルトの動作:両方の値が等しい場合は0それ以外の場合に戻ります-1

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

説明:知っているように、Boolean.compareのデフォルトの戻り値は、不一致の場合は-1であるため、+ 1は、戻り値を0False11に設定します。True


3
Boolean.compare(myBoolean, false)引用された説明に対してより適切に対応します
Vadzim

@Vadzimはい、確かにfalseと比較して1と0を生成し、現在のシナリオでは0と-1を生成します。どちらのソリューションも問題なく、コメントに対して+1になります:-)
mumair

0

値をキャストするためのifステートメントの周りにラッパーメソッドを記述しなければならないという事実は、Javaがすでに死ぬはずの理由の膨大なリストに追加されているだけです。そして、3項演算子が関数にラップされておらず、どこにでもコピーして貼り付けられているのを見ると、intへのブール型キャストがちょうど私を狂わせるのがわかります。これは、CPUサイクルの無駄であり、コードの読みやすさに対する侮辱です。

また、ここでの回答のほとんどは、説明がゼロの何百もの賛成票を持っているので、悪い習慣は、Javaに非常にさらされた結果にすぎないと思います。booleanを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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.