2017-03-24 6 views
0

Pythonでrange関数のような値の範囲を取得したいと考えています。Javaで値の範囲を取得する方法

# Python range 
a = range(0,1.0,0.01) 
b = range(5,10,2) 

Javaでは、このような結果をListとしたいと考えています。

// Java range 
public class range{ 

    private double start; 
    private double end; 
    private double step; 

    public range(double start,double end, double step) { 
     this.start = start; 
     this.end = end; 
     this.step = step; 
    } 

    public List<Double> asList(){ 
     List<Double> ret = new ArrayList<Double>(); 
     for(double i = this.start;i <= this.end; i += this.step){ 
      ret.add(i); 
     } 

     return ret; 
    } 
} 

しかし、このコードでは整数の範囲が必要なときに冗長性を計算すると思います。

Javaでよりスマートな方法や実装ができますか?

+1

「冗長性を計算する」とは何ですか? – muzzlator

+0

Pythonにあるように、すべてのプリミティブ型に対して汎用的な解決策が必要ですか? – ilya

+0

@muzzlator Integersをコンストラクタに置くと、doubleとして扱われます。 asListの計算では、doubleの精度は必要ないと思います。この間違いですか? – ric

答えて

2

あなたは範囲を生成し、最初の数は包括的であり、第二は、排他的であることをリスト

IntStream.range(0, 10) 
     .collect(Collectors.toList()); 

注意にそれを収集するために、ストリームを使用することができます。 rangeClosedメソッドを使用すると、2番目の引数を含めることができます。 http://docs.oracle.com/javase/8/docs/api/java/util/stream/IntStream.html#range-int-int-

他のプリミティブには他のタイプのストリームがあります(例:DoubleStream.iterateを参照)。

+0

これに加えて、[rangeCloses](https://docs.oracle.com/javase/8/docs/api/java/util/stream/IntStream.html#rangeClosed-int-int-)メソッドがあります。両端が含まれています。 – ilya

+0

その他のプリミティブには他のストリームタイプもあります(例えばDoubleStream.generateまたはiterateを参照してください) –

+0

答えを編集してこのすべての追加情報を含めてください。 – ilya

0

任意のタイプの番号を生成する可能性があり、サードパーティライブラリを使用することが許可されている場合は、Guava Rangesを使用することをおすすめします。

最上部のRangesは、「数学的抽象」として範囲を操作するために使用されます。しかし、あなたは範囲からシーケンスを生成するために許可されている:整数、longと大きな整数:

Set<Integer> set = ContiguousSet.create(Range.closed(1, 5), DiscreteDomain.integers()); 
// set contains [2, 3, 4] 

デフォルトでは、グアバは、個別のドメインの3種類をご提供しています。

独自のDiscreteDomainオブジェクトを作成できますが、覚えておく必要があるDiscreteDomainコントラクトのいくつかの重要な側面があります。

official docsDiscreteDomain実装の特質をご確認ください。

+0

ありがとう、ライブラリは私の目的のために便利です。 – ric

関連する問題