แปลงบูลีนเป็น int ใน Java


350

วิธีที่ได้รับการยอมรับมากที่สุดในการแปลง a booleanเป็นintin Java คืออะไร?


8
จำนวนเต็มใดที่คุณคิดว่าสอดคล้องtrueและfalseตามลำดับ
Thorbjørn Ravn Andersen

5
บางภาษามีการแปลงโดยนัยจาก int เป็นบูลีน Java ไม่ได้ อย่างไรก็ตามการดำเนินการอย่างเป็นทางการมีแพคเกจ SQL และผมเชื่อว่าการแปลงเหล่านี้ "เท็จ" เพื่อ 0.
hpique

4
@Peter Lawrey ไม่ได้หากคุณต้องการทำงานร่วมกับระบบอื่น ๆ ที่ไม่มีบูลีนเป็นประเภทข้อมูลที่ไม่ใช่ตัวเลข
hpique

6
@ Peter Lawrey คำถามไม่ได้เกี่ยวกับการจับคู่ค่า มันเกี่ยวกับวิธีการแปลงในวิธีที่ชัดเจนและเป็นที่ยอมรับมากที่สุด
hpique

8
ในทางเทคนิคคอมไพเลอร์ 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ใช่ในขณะที่ เห็นได้ชัดว่าถ้ามันเป็นเพียงตัวบ่งชี้ parens ไม่จำเป็นหรือเป็นที่ต้องการ
Blrfl

เคล็ดลับที่ดีกับบูลีน! ฉันกำลังมองหาบางคนอาจมีการคัดเลือกนักแสดงเช่น (int) จริง = 1 แต่การสังเกตมีอยู่เช่นนี้: P
mumair

1
สำหรับผู้เริ่มต้นอย่างฉัน(boolean expression) ? 1 : 0;จะเข้าใจได้ง่ายขึ้น ฉันคิดว่าmyคำนำหน้าทำให้ดูเหมือนตัวแปร
dixhom

12
@Blrfl ในวงเล็บตัวอย่างของคุณเป็นสิ่งที่ต้องมีไม่ใช่เรื่องของการอ่านได้ foo && (!bar || baz) ? 1 : 0จะเป็นข้อผิดพลาดทางไวยากรณ์ (ฉันรู้ว่ามันเป็นเวลา 6 ปี)
Konrad Morawski


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 เพียง "ค่าบวกถ้าวัตถุนี้แสดงถึงความจริงและอาร์กิวเมนต์เป็นเท็จ"
shmosel

1
ฉันเพิ่งทำการทดสอบที่แปลงค่าบูลีนแบบสุ่ม 1,000,000 ค่าและวิธีนี้เร็วกว่าค่าที่ยึดตามตัวดำเนินการแบบไตรภาค มันโกนออกประมาณ 10ms
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
มันสร้างสรรค์อย่างแน่นอน แต่ฉันไม่สามารถนึกถึงข้อได้เปรียบเดียวในการใช้วิธีนี้ มัน verbose มากขึ้นและ (ฉันเดา) มีประสิทธิภาพน้อยกว่า แต่แน่ใจว่าเป็นวิธีที่น่าสนใจ
Mike Baxter


24
import org.apache.commons.lang3.BooleanUtils;
boolean x = true;   
int y= BooleanUtils.toInteger(x);

FWIW, จะดำเนินการเป็นเพียงแค่BooleanUtils.toInteger return bool ? 1 : 0;
โซโลมอน Ucko

Apache Commons มีประโยชน์ แต่นี่เป็นเพียงเรื่องน่าขัน
Eric Duminil

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;
โซโลมอน Ucko

8

หากtrue -> 1และfalse -> 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 จึงให้ค่าตอบแทนเป็น0สำหรับFalseและ1สำหรับTrue


3
Boolean.compare(myBoolean, false)จะพอดีกับคำอธิบายที่ยกมาดีกว่า
Vadzim

@Vadzim ใช่แล้วจะสร้าง 1 และ 0 โดยเปรียบเทียบกับ false และในสถานการณ์ปัจจุบันมันจะสร้าง 0 และ -1 โซลูชันทั้งสองนั้นใช้ได้ดีและ +1 สำหรับความคิดเห็นของคุณ :-)
mumair

0

ความจริงที่ว่าฉันต้องเขียนวิธีการ wrapper รอบคำสั่ง if สำหรับการหล่อค่าเพียงเพิ่มรายการใหญ่เหตุผลแล้วทำไม java ควรตายแล้ว และการเห็นผู้ประกอบการที่ไม่ได้ห่อหุ้มฟังก์ชั่น แต่เพียงแค่คัดลอกวางทุกที่ที่ฉันเห็นนักแสดงบูลีนเพื่อ int เพียงแค่ขับรถฉันถั่ว มันเป็นการสิ้นเปลือง cpu cycles และดูถูกการอ่านโค้ด

นอกจากนี้คำตอบส่วนใหญ่ที่นี่มี upvote หลายร้อยคำที่ไม่มีคำอธิบายซึ่งทำให้ฉันเดาได้ว่าการฝึกฝนที่ไม่ดีนั้นเป็นผลมาจากการสัมผัสจาวามาก ถ้าฉันเขียนโอเปอเรเตอร์สำหรับการหล่อบูลีนเป็นภาษาที่ทันสมัยฉันจะโดนไล่ออกในวันถัดไปจากงานที่ฉันมี ดังนั้นวันนี้ฉันเลิกพยายามใช้เหตุผลด้วยการมอบหมายจาวาของฉันและตัดสินใจยอมรับความโง่เขลา:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.