2011-10-11 10 views
27

さて、整数Aの範囲が必要としましょう: を[0 ... 2147483647]Javaの範囲は何ですか?

だから、基本的には、擬似コードは次のようになります:整数Aは、その範囲内であれば 何かを... 他に何か他のことをしてください。

単純なif..elseステートメント で実現できますが、Aが範囲内にあるかどうかを確認するより効率的な方法はありますか?

それはそう間違っているようですので、私はこれで行くにしたくない:

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

編集:私はこれを行う方法をので、私はちょうど頼むつもりだ、私は間違った質問をしていると思います多型アプローチを使用します。私が読んできた本は本当に長い例があるので、私はちょっと単純なイラストが必要です。 > _ <申し訳ありません。

答えて

1

あなたはこの集中的でない計算をいかに効率的にしようと効率的であってもif-checkを得るでしょう。あなたはおそらくブール値のビットシフトロジックを実行してそれを理解することができますし、必要ならFermatの定理を使用することもできますが、この点を最適化する必要があるのはなぜですか?目的は何ですか?

+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 ... ohの比較構文が気に入らないと思った。 – ScArcher2

+0

この実装では、空の範囲を表すことはできません( 'low <= high'と仮定します)。間隔は '[low、high]'の半分にするか、 '' high''の代わりに '' extent''を使用する必要があります。 – 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があります。

数値が長い値またはint値に収まるかどうかを確認したい場合は、BigDecimalを使用してみます。 longValueExactintValueExactには、値がその精度に対して大きすぎる場合に例外をスローするメソッドがあります。

+2

はい、 '.contains(...)'はどのように実装されていると思いますか? ;)(確かにif/elseを使って) – PhD

3

あなたはlong受け入れjava.time.temporal.ValueRangeを使用することができますし、また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 sの範囲を取得することができます:

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 
} 
関連する問題