2011-10-11 42 views
27

Được rồi, chúng ta hãy nói một số nguyên A nên có phạm vi: [0 ... 2147483647]Phạm vi trong Java, cách tiếp cận tốt nhất là gì?

Vì vậy, về cơ bản, mã giả đi như thế này: nếu số nguyên A là trong phạm vi đó làm điều gì đó ... người khác làm điều gì đó khác.

Tôi biết nó có thể được thực hiện bằng câu lệnh if..else đơn giản, nhưng có cách nào hiệu quả hơn để kiểm tra xem A có nằm trong phạm vi không?

Tôi không muốn đi với điều này bởi vì nó dường như sai:

if (A >= 0 && A <= 2147483647){ 
    // do something 
}else{ 
    // do something else 
} 

chỉnh sửa: Tôi nghĩ rằng tôi đang đặt ra câu hỏi sai vì vậy tôi chỉ gonna hỏi, làm thế nào để làm điều này sử dụng phương pháp đa hình. Tôi chỉ cần một số minh họa đơn giản vì cuốn sách mà tôi đã đọc có một ví dụ thực sự dài. > _ < Xin lỗi.

Trả lời

1

Bạn sẽ có một kiểm tra nếu bạn cố gắng tối ưu hóa tính toán không chuyên sâu này như thế nào hiệu quả :) Bạn có thể trừ giới hạn trên khỏi số và nếu đó là số dương bạn biết bạn nằm ngoài phạm vi. Bạn có lẽ có thể thực hiện một số logic boolean bit shift để tìm ra và bạn thậm chí có thể sử dụng định lý Fermat nếu bạn muốn (đùa :) Nhưng vấn đề là "tại sao" bạn cần tối ưu hóa so sánh này? Mục đích gì?

+1

Tôi có OP - loại kiểm tra thủ tục này luôn cảm thấy khó xử. Tôi thích hợp đồng khai báo khi có sẵn, ngay cả khi trước đây cuối cùng cũng giảm xuống. –

+0

Tôi cần tối ưu hóa vì tôi thấy nó chậm hơn nhiều khi nói A là một con số thực sự lớn. Và nếu tôi chọn mở rộng và thực hiện các kiểm tra khác trong câu lệnh if..else đó thì sao? > _ < –

+2

Bạn phải đùa - chậm? Như trong bạn đã đo nó để thực hiện xấu? – StaxMan

14

Bạn có thể tạo một lớp học để đại diện này

Range range = new Range(0, 2147483647); 

if(range.contains(A)){ 
    //do something 
}else{ //do something else } 



public class Range { 

    private int low; 
    private int high; 

    public Range(int low, int high){ 
     this.low = low; 
     this.high = high; 
    } 

    public boolean contains(int number){ 
     return (number >= low && number <= high); 
    } 
} 
+0

Tôi bây giờ thấy bạn đang cố gắng tránh nếu. Tôi nghĩ bạn chỉ không thích cú pháp so sánh trong nếu ... oh well. – ScArcher2

+0

Với việc thực hiện này, bạn không thể đại diện cho một phạm vi trống (giả sử 'thấp <= cao'). Khoảng thời gian phải là nửa mở '[thấp, cao)' hoặc người khác sử dụng một 'mức độ' thay vì' cao'. – Richard

5

Nếu bạn đang kiểm tra chống lại rất nhiều khoảng thời gian, tôi đề nghị sử dụng một interval tree.

+0

Có một thư viện Java đã biết có thực hiện một cây khoảng không? – dokaspar

30

Apache Commons Lang có số Range class để thực hiện các phạm vi tùy ý.

Range<Integer> test = Range.between(1, 3); 
System.out.println(test.contains(2)); 
System.out.println(test.contains(4)); 

Guava Range có API tương tự.

Nếu bạn chỉ muốn kiểm tra xem một số có khớp với giá trị dài hoặc giá trị int hay không, bạn có thể thử sử dụng số này qua BigDecimal. Có các phương pháp cho longValueExactintValueExact ném các ngoại lệ nếu giá trị quá lớn đối với các biện pháp đó.

+2

Có, nhưng bạn nghĩ '.contains (...)' được thực hiện như thế nào? ;) (Với một if/else chắc chắn :) – PhD

3

Bạn có thể sử dụng java.time.temporal.ValueRange mà chấp nhận long và cũng sẽ làm việc với int:

int a = 2147; 

    //Use java 8 java.time.temporal.ValueRange. The range defined 
    //is inclusive of both min and max 
    ValueRange range = ValueRange.of(0,2147483647); 

    if(range.isValidValue(a)) { 
     System.out.println(" in range "); 
    }else { 
     System.out.println(" not in range "); 
    } 
+0

Tôi chưa bao giờ biết về đá quý tích hợp này cho đến bây giờ. Cám ơn vì đã chia sẻ! – TinkerTenorSoftwareGuy

+0

@TinkerTenorSoftwareGuy bạn được chào đón nhiều nhất (0: – c0der

2

Tôi biết điều này là khá một câu hỏi cũ, nhưng với Java 8 của Streams bạn có thể nhận được một loạt các int s như thế này:

IntStream.rangeClosed(0, Integer.MAX_VALUE); // gives an IntStream of integers from 0 through Integer.MAX_VALUE 

Sau đó, bạn có thể làm một cái gì đó như thế này:

if (IntStream.rangeClosed(0, Integer.MAX_VALUE).matchAny(n -> n == A)) { 
    // do something 
} else { 
    // do something else 
} 
Các vấn đề liên quan