Chuyển đổi boolean thành int trong Java


350

Cách được chấp nhận nhất để chuyển đổi booleanthành một inttrong Java là gì?


8
Những số nguyên nào bạn nghĩ tương ứng truefalsetương ứng?
Thorbjørn Ravn Andersen

4
Một số ngôn ngữ đã chuyển đổi ngầm định từ int sang boolean. Java thì không. Tuy nhiên, việc triển khai chính thức có các gói SQL và tôi tin rằng các chuyển đổi này "sai" thành 0.
hpique

4
@Peter Lawrey Không phải nếu bạn muốn tương tác với các hệ thống khác không có boolean dưới dạng kiểu dữ liệu không phải là số.
hpique

6
@Peter Lawrey Câu hỏi không thực sự về ánh xạ giá trị. Đó là về cách thực hiện chuyển đổi theo cách rõ ràng nhất, được chấp nhận.
hpique

7
Về mặt kỹ thuật, trình biên dịch Java đã định nghĩa một ánh xạ. Đúng và Sai được biên dịch thành 1 và 0 tương ứng.
Antimon

Câu trả lời:


583
int myInt = myBoolean ? 1 : 0;

^^

PS: đúng = 1 và sai = 0


59
Trong trường hợp myBoolean là viết tắt của biểu thức boolean, sử dụng dấu ngoặc đơn sẽ dễ đọc hơn.
rsp

40
Vâng, như trong (foo && (!bar || baz)) ? 1 : 0. Rõ ràng, nếu nó chỉ là một định danh, thì các parens không cần thiết hoặc không mong muốn.
Blrfl

mẹo hay với boolean! Tôi đang tìm kiếm một số diễn viên có thể tồn tại như (int) true = 1, nhưng lưu ý tồn tại như thế này: P
mumair

1
Đối với những người mới bắt đầu như tôi, (boolean expression) ? 1 : 0;sẽ dễ hiểu hơn. Tôi nghĩ mytiền tố làm cho nó trông giống như một biến.
dixhom

12
@Blrfl trong ngoặc đơn ví dụ của bạn là bắt buộc , không phải là vấn đề dễ đọc. foo && (!bar || baz) ? 1 : 0sẽ là một lỗi cú pháp. (Tôi biết đã 6 năm rồi)
Konrad Morawski


59

Sử dụng toán tử ternary là cách đơn giản nhất, hiệu quả nhất và dễ đọc nhất để làm những gì bạn muốn. Tôi khuyến khích bạn sử dụng giải pháp này.

Tuy nhiên, tôi không thể cưỡng lại việc đề xuất một giải pháp thay thế, không có hiệu quả, không thể đọc được.

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

Hey, mọi người thích bỏ phiếu cho câu trả lời tuyệt vời như vậy!

Biên tập

Nhân tiện, tôi thường thấy các chuyển đổi từ boolean sang int với mục đích duy nhất là thực hiện so sánh hai giá trị (nói chung, trong việc triển khai compareTophương thức). Boolean#compareTolà cách để đi trong những trường hợp cụ thể.

Chỉnh sửa 2

Java 7 đã giới thiệu một hàm tiện ích mới hoạt động trực tiếp với các kiểu nguyên thủy, Boolean#compare(Cảm ơn shmosel )

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

1
Sẽ được nội tuyến của JIT hiện đại, do đó không nhất thiết là không hiệu quả. Ngoài ra, tài liệu tại sao b.compareTo đang được sử dụng để có thể đọc được.
Thorbjørn Ravn Andersen

2
Nó có thể chậm vì chúng ta cần đóng hộp giá trị nguyên thủy trong một đối tượng. Phương thức toán tử ternary hoạt động trực tiếp với các giá trị nguyên thủy mà không cần chuyển đổi, vì vậy tôi nghĩ rằng nó hiệu quả hơn.
barjak

5
1. Bạn có thể sử dụng Boolean.compare()và tránh hộp số tự động. 2. Tài liệu cho Boolean.compareTo()biết nó sẽ không trả về 1, chỉ "giá trị dương nếu đối tượng này đại diện cho đúng và đối số đại diện cho sai".
shmosel

1
Tôi vừa thực hiện một thử nghiệm chuyển đổi 1.000.000 giá trị Boolean ngẫu nhiên và phương pháp này nhanh hơn so với phương pháp dựa trên toán tử ternary. Nó cạo đi khoảng 10ms.
Mapsy

3
@AlexT. nếu bạn thực hiện đánh dấu vi mô, bạn nên sử dụng khung để đảm bảo rằng bạn đo chính xác. Xem openjdk.java.net/projects/code-tools/jmh .
Thorbjørn Ravn Andersen

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

14
Tôi nghĩ rằng điều này sẽ phù hợp hơn như bình luận, không phải là một câu trả lời.
hpique

164
5 - b.toString().length
kennytm

5
@ ThorbjørnRavnAndersen Vâng. Sử dụng một trong những phương pháp khác, hiệu quả hơn, được đăng mà không yêu cầu chi phí đó. Trừ khi bạn có thể giải thích cách tạo các đối tượng chuỗi chỉ đơn giản là kiểm tra giá trị của boolean theo bất kỳ cách nào hiệu quả.
b1nary.atr0phy

10
@ ThorbjørnRavnAndersen Tôi không kiểm soát được phương thức của mình được sử dụng hay tần suất chúng được gọi, đó hoàn toàn là vấn đề. Bạn đang hy sinh cả hiệu suất và khả năng đọc để hoàn toàn không có lợi ích hữu hình.
b1nary.atr0phy

6
Nó chắc chắn sáng tạo nhưng tôi không thể nghĩ ra một lợi thế duy nhất để sử dụng phương pháp này. Nó dài dòng hơn và (tôi đoán) kém hiệu quả hơn, nhưng chắc chắn đó là một phương pháp thú vị.
Mike Baxter

27
public int boolToInt(boolean b) {
    return b ? 1 : 0;
}

đơn giản


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

FWIW, BooleanUtils.toIntegerđược thực hiện như chỉ return bool ? 1 : 0;.
Solomon Ucko

Apache Commons có thể hữu ích, nhưng điều này thật vô lý.
Eric Duminil

14

Điều đó phụ thuộc vào tình hình. Thường thì cách tiếp cận đơn giản nhất là tốt nhất vì nó dễ hiểu:

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

hoặc là

int otherThing = something ? 1 : 0;

Nhưng đôi khi nó hữu ích khi sử dụng Enum thay vì cờ boolean. Hãy tưởng tượng có các quy trình đồng bộ và không đồng bộ:

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

Trong Java, enum có thể có các thuộc tính và phương thức bổ sung:

public enum Process {

    SYNCHRONOUS (0),
    ASYNCHRONOUS (1);

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

    public int getCode() {
        return code;
    }
}

6
Một lý do bổ sung cho việc sử dụng if thay vì ?:là bạn có thể đặt các điểm dừng bên trong các khối if.
Thorbjørn Ravn Andersen

12

Nếu bạn sử dụng Apache Commons Lang (mà tôi nghĩ rằng rất nhiều dự án sử dụng nó), bạn có thể sử dụng nó như thế này:

int myInt = BooleanUtils.toInteger(boolean_expression); 

toIntegerphương thức trả về 1 nếu boolean_expressionđúng, 0 nếu không


FWIW, BooleanUtils.toIntegerđược thực hiện như chỉ return bool ? 1 : 0;.
Solomon Ucko

8

Nếu true -> 1false -> 0ánh xạ là những gì bạn muốn, bạn có thể làm:

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

6

Nếu bạn muốn làm xáo trộn, hãy sử dụng điều này:

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

3

Hãy chơi trò lừa với Boolean.compare(boolean, boolean). Hành vi mặc định của hàm: nếu cả hai giá trị bằng nhau thì nó trả về 0khác -1.

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

Giải thích : Như chúng ta đã biết tỷ lệ trả về mặc định của Boolean.compare là -1 trong trường hợp khớp sai, do đó +1 tạo giá trị trả về 0 cho False1 choTrue


3
Boolean.compare(myBoolean, false)sẽ phù hợp hơn với sự phù hợp với mô tả được trích dẫn
Vadzim

@Vadzim Có thực sự sẽ tạo 1 và 0 bằng cách so sánh với false và trong kịch bản hiện tại, nó sẽ tạo 0 và -1. Cả hai giải pháp đều ổn và +1 cho nhận xét của bạn :-)
mumair

0

Thực tế là tôi phải viết một phương thức bao bọc xung quanh một câu lệnh if để truyền giá trị chỉ thêm vào danh sách lớn lý do tại sao java nên chết. Và nhìn thấy toán tử ternary thậm chí không được bao bọc trong một hàm mà chỉ sao chép được dán ở khắp mọi nơi, tôi thấy một boolean cast để int chỉ khiến tôi phát điên. Thật lãng phí chu kỳ cpu và xúc phạm đến khả năng đọc mã.

Ngoài ra hầu hết các câu trả lời ở đây có hàng trăm câu trả lời với lời giải thích bằng không, điều này khiến tôi đoán rằng thực tiễn xấu chỉ là kết quả của việc tiếp xúc với java rất nhiều. Nếu tôi viết một toán tử ternary để chuyển boolean sang int bằng bất kỳ ngôn ngữ hiện đại nào, tôi sẽ bị đuổi việc vào ngày hôm sau từ bất kỳ công việc nào tôi có thể có. Vì vậy, hôm nay tôi đã từ bỏ việc cố gắng sử dụng lý do với các bài tập java của mình và quyết định chấp nhận sự ngu ngốc:

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

Sau đó sử dụng :

convBool(aBool);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.