2011-10-11 44 views
27

好吧,讓我們說,一個整數A應具有的範圍: [0 ... 2147483647]Java中的範圍,最好的方法是什麼?

所以基本上,僞代碼是這樣的:如果 整數,A是該範圍內做一些事情......其他人做其他事情。

我知道這可以通過一個簡單的if..else語句, 來完成,但有沒有更有效的方法來檢查A是否在範圍內?

我不想去這一點,因爲我覺得自己錯了:

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

編輯:我想我問錯了問題,所以我只是要問,如何做到這一點使用多態性方法。我只是需要一些簡單的插圖,因爲我一直在閱讀的這本書有一個非常長的例子。 > _ <對不起。

回答

1

無論你如何有效地優化這個不太密集的計算,你都會有一個if-check。你可以從數字中減去上限,如果它是正數,你知道你超出範圍。你也許可以執行一些布爾位移邏輯來解決它,如果你想要的話,甚至可以使用費馬定理(開玩笑:)但是關鍵是「爲什麼」你需要優化這個比較?目的是什麼?

+1

我與OP - 這種程序檢查一直感到尷尬。即使前者最終減少到後者,我也更喜歡聲明式合同。 –

+0

我需要優化,因爲當我們說A是一個非常大的數字時,我發現它慢得多。如果我選擇在if..else聲明中擴展並做其他檢查呢? > _ < –

+2

你一定是在開玩笑 - 慢?如你在測量它表現不佳? – StaxMan

14

您可以創建一個類來表示這個

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

我現在看到你試圖避免if。我以爲你只是不喜歡if ...哦的比較語法。 – ScArcher2

+0

通過這個實現,你不能表示一個空的範圍(假設'low <= high')。間隔必須半開放[[低,高]),否則使用'extent'而不是'high'。 – Richard

5

如果要檢查對很多間隔的,我建議使用interval tree

+0

是否有一個已知的Java庫實現間隔樹? – dokaspar

30

Apache Commons Lang有一個Range class用於執行任意範圍。

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

Guava Range具有類似的API。

如果您只是想檢查數字是否適合長整型值或整型值,則可以嘗試通過BigDecimal來使用它。有longValueExactintValueExact的方法會拋出異常,如果該值對於這些精度來說太大。

+2

是的,但您認爲'.contains(...)'是如何實現的? ;)(用if/else肯定:) – PhD

3

你可以使用java.time.temporal.ValueRange它接受long也將與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

我從來不知道這個內置的寶石,直到現在。感謝分享! – TinkerTenorSoftwareGuy

+0

@TinkerTenorSoftwareGuy非常歡迎您(0: – c0der

2

我知道這是一個很老的問題,但與Java 8個的流就可以得到一系列的int就像這樣:

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

然後,你可以做這樣的事情:

if (IntStream.rangeClosed(0, Integer.MAX_VALUE).matchAny(n -> n == A)) { 
    // do something 
} else { 
    // do something else 
} 
相關問題