Convert boolean to int in Java
在Java中,将EDCOX1的0度转换为EDCOX1×1的方法是最被接受的方法?
- 你认为对应于true和false的整数是什么?
- 有些语言有从int到boolean的隐式转换。但是,官方实现有SQL包,我相信这些转换为"false"到0。
- 通常,布尔值应保留为布尔值。这是Java中公认的实践。
- @如果您想与其他没有布尔值作为非数字数据类型的系统进行互操作,请不要使用PeterLawrey。
- @在hgpc中,您可以知道哪些值需要正确和错误来表示。这些通常是字节值(尽管这里的大多数示例是int值),但可以是"0"或"1"(48和49)或"t"和"f"、"y"或"n"及其ASCII值。
- @彼得·劳里,问题不在于价值映射。这是关于如何以最清晰、最可接受的方式进行转换。
- @如果你不知道要映射到什么,就不能对映射进行编码。
- 从技术上讲,Java编译器已经定义了映射。true和false分别编译为1和0。
- 我在这里回答了类似的问题
- 这个问题的用例是什么?
1
| int myInt = myBoolean ? 1 : 0; |
^ ^
ps:真=1,假=0
- 在MyBoolean代表布尔表达式的情况下,使用括号更易读。
- 更具可读性?只有未经训练的眼睛。
- 是的,和(foo && (!bar || baz)) ? 1 : 0中一样。显然,如果它只是一个标识符,那么parens就不必要也不可取了。
- 很好的布尔技巧!我在看一些演员阵容可能存在,比如(int)true=1,但是注意到这样的存在:p
- 对于像我这样的初学者来说,(boolean expression) ? 1 : 0;更容易理解。我认为my前缀使它看起来像一个变量。
- @示例括号中的blrfl是必须的,而不是可读性问题。foo && (!bar || baz) ? 1 : 0是一个语法错误。(我知道已经6年了)
- 从投票结果来看,这似乎是最被接受的方式。接受格罗德里格斯的回答,因为这是第一个。
- 我不在乎,但这不是真的(不是第一次)。
- 它还缺少一个空间,来吧!
- @从一个人对这行代码所能说的所有事情来看,你不得不抱怨一个毫无意义的空间?真的?
- 是的,那是花生画廊里的我们;-)尽管如此,我从未见过像这样格式化的三元运算符和良好的编码标准通常力求一致性和最不令人吃惊的原则。
- 你真的,真的很惊讶吗?
- 我真的很深吗??
使用三元运算符是最简单、最有效和最易读的方法,可以满足您的需要。我鼓励你使用这个解决方案。
然而,我不能拒绝提出一个替代的、人为的、低效的、不可读的解决方案。
1 2 3
| int boolToInt (Boolean b ) {
return b. compareTo(false);
} |
嘿,人们喜欢投票给这么酷的答案!
编辑
顺便说一下,我经常看到从布尔值到int值的转换,只是为了比较这两个值(通常,在compareTo方法的实现中)。Boolean#compareTo是处理这些特定情况的方法。
编辑2
Java 7引入了一种新的实用函数,它直接与原始类型一起工作,EDCOX1×4(感谢SMOMOEL)
1 2 3
| int boolToInt (boolean b ) {
return Boolean. compare(b, false);
} |
- 将由现代JIT的内联,因此不一定效率低下。它还记录了为什么使用b.compareto,因此它是可读的。
- 它可能很慢,因为我们需要将原语值框在对象中。三元运算符方法直接与基元值一起工作,不需要转换,因此我认为它更有效。
- 1。你可以使用Boolean.compare()避免自动氧化。2。Boolean.compareTo()的文档没有说它将返回1,只是"如果这个对象表示真,参数表示假,则返回一个正值"。
- 我刚刚做了一个转换1000000个随机布尔值的测试,这个方法比基于三元运算符的方法更快。它剃掉了大约10毫秒。
- @ AlexT。如果你做了微基准,你应该使用一个框架来确保你的测量是正确的。请参见openjdk.java.net/projects/code-tools/jmh。
- @Thorbj&248;rnravandersen你的测试得出了什么结论?我使用一个访问者模式来模拟一个if语句,如果访问者模式涉及的对象是预先分配的,那么三元运算符的速度会一直较慢。我想这和分支预测有关。
- 我真的需要Boolean#compare;)
- @ AlexT。我什么也没说。也许您可以让您的测试可用,这样我们就可以复制它了?
1 2
| boolean b = ....;
int i = -("false".indexOf("" + b)); |
- +1、非常有创意。
- 我无法想象这是"最被接受的方式"。真的很有创造力!
- 我认为这更适合作为评论,而不是回答。
- 5 - b.toString().length
- 不确定不必要地创建字符串是否是一个好主意…
- @有什么建议吗?
- @索比&248;恩拉夫南德森是的。使用另一种更有效的方法,这些方法不需要开销。除非您可以解释如何创建字符串对象来简单地检查布尔值,否则在任何方面都是有效的。
- @b1Naryatr0phy您过早地进行了微优化。
- @Thorbj&248;rnravandersen微观优化与此无关,因为这都是一个上下文问题。如果我调用一个方法1000000+次,使用这个块,那么我可能会创建1000000+个需要GC'D的额外对象。我不确定你的工作要求有多高,但是如果我尝试使用类似的东西,我的老板会把我拉到一边,给我一个WTF讲座。
- @如果你把一个缓慢的方法称为凝视时间,你的老板应该教你如何记忆。
- @Thorbj&248;rnravandersen我无法控制我的方法是如何使用的,或者它们被调用的频率,这完全是关键所在。您牺牲了性能和可读性,完全没有实际的好处。
- @b1naryatr0phy所以如果我用Boolean.toString(b)而不是"" + b,以避免字符串串联,那你会同意吗?
- 它绝对是有创意的,但我想不出使用这种方法的单一优势。它更冗长,而且(我猜)效率更低,但它确实是一个有趣的方法。
- @Thorbj&248;rnravandersen-你以前参加过Perl模糊处理比赛吗?;)
- @肯尼-我的帽子给你了。至于你,索比&恩-超级创意!
- @肯尼特:聪明的黑客……但小巧玲珑:如果b是原始boolean,我想你需要使用:5 - Boolean.toString(b).length
- @基维纳普,然后是埃多克斯11〔10〕。
- 我想作者给出这个答案只是为了好玩和创造力,它是黑客……,有趣的是看到一些人不理解…
1 2 3
| public int boolToInt(boolean b) {
return b ? 1 : 0;
} |
简单的
1 2 3
| import org.apache.commons.lang3.BooleanUtils;
boolean x = true;
int y= BooleanUtils.toInteger(x); |
- 不知道为什么这个答案被否决了这么多。如果您已经在使用ApacheCommons,那么为什么不使用库呢?
这取决于具体情况。通常,最简单的方法是最好的,因为它很容易理解:
1 2 3 4 5
| if (something) {
otherThing = 1;
} else {
otherThing = 0;
} |
或
1
| int otherThing = something ? 1 : 0; |
但有时使用枚举而不是布尔标记很有用。假设有同步和异步进程:
在爪哇,EnUM可以有其他属性和方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public enum Process {
SYNCHRONOUS (0),
ASYNCHRONOUS (1);
private int code ;
private Process (int code ) {
this. code = code ;
}
public int getCode () {
return code ;
}
} |
- 使用if而不是?:的另一个原因是,可以在if块中放置断点。
如果您使用ApacheCommonsLang(我认为很多项目都使用它),您可以这样使用它:
1
| int myInt = BooleanUtils.toInteger(boolean_expression); |
如果boolean_expression为真,则toInteger方法返回1,否则返回0
如果您需要true -> 1和false -> 0映射,可以执行以下操作:
1 2
| boolean b = true;
int i = b ? 1 : 0; // assigns 1 to i. |
如果要混淆,请使用:
- 低估溶液。
- 这很有趣,因为它看起来有点奇怪,但实际上是有效的。
让我们和Boolean.compare(boolean, boolean)玩把戏吧。函数的默认行为:如果两个值都等于,则返回0,否则返回-1。
说明:我们知道Boolean.Compare的默认返回值是-1,如果不匹配,则so+1使返回值为0,对于False,返回值为1,对于True。
- Boolean.compare(myBoolean, false)更适合于引用的描述。
- @Vadzim Yes确实将通过与false比较生成1和0,在当前场景中,它将生成0和-1。这两个解决方案都很好,请评论+1:-)
1 2 3 4 5 6
| public static int convBool(boolean b)
{
int convBool = 0;
if(b) convBool = 1;
return convBool;
} |
然后使用:
1
| MyClass.convBool(aBool); |