Java:Pythonのrange(int、int)と同等ですか?


99

JavaにはPythonのrange(int, int)メソッドと同等のものはありますか?


リストを返すPython 2.x範囲、またはイテレータ(2.x xrangeと同等)を返すPython 3.x範囲ですか?前者は、他の人が以下で行ったように実装するのが比較的簡単ですが、イテレーターバージョンは少しトリッキーです。
デイブカービー


Comparablesの範囲については、この回答を参照してください
c0der

参照ステッピングと範囲については、この
SławomirLenart

回答:


27

GuavaはPythonのようなものも提供していますrange

Range.closed(1, 5).asSet(DiscreteDomains.integers());

GuavaのAbstractIteratorを使用して同じようなことを行うために、かなり単純なイテレーターを実装することもできます。

return new AbstractIterator<Integer>() {
  int next = getStart();

  @Override protected Integer computeNext() {
    if (isBeyondEnd(next)) {
      return endOfData();
    }
    Integer result = next;
    next = next + getStep();
    return result;
  }
};

6
私が自分の一般的な範囲を実装する前にこれを見ていたらいいのですが。それは素晴らしいですが、不格好なJavaをより関数型の言語と比較する方法を思い出させるもう1つの思い出です。
z7sg

14
Range#asSet廃止されたようです。これを行う必要があります:ContiguousSet.create(Range.closed(low, high), DiscreteDomain.integers())
Chthonicプロジェクト

これを使用するには、どのライブラリをインポートする必要がありますか?
tgabb

Java 8以降、IntStreamとLongStreamにはメソッドrangeとrangeClosedがあります。
ホセマヌエルゴメスアルバレス


16

Guava 15.0以降、Range.asSet()は非推奨になり、バージョン16で削除される予定です。代わりに以下を使用してください。

ContiguousSet.create(Range.closed(1, 5), DiscreteDomain.integers());

15

私はJoolsと呼ばれる小さなJava utilsライブラリに取り組んでRangeいます。これには、必要な機能を提供するクラスが含まれています(ダウンロード可能なJARがあります)。
コンストラクタはどちらかRange(int stop)Range(int start, int stop)またはRange(int start, int stop, int step)(forループに似)、あなたはどちらかの反復それをすることができ、遅延評価を使用している、またはあなたがその使用することができtoList()、明示的範囲のリストを取得する方法を。

for (int i : new Range(10)) {...} // i = 0,1,2,3,4,5,6,7,8,9

for (int i : new Range(4,10)) {...} // i = 4,5,6,7,8,9

for (int i : new Range(0,10,2)) {...} // i = 0,2,4,6,8

Range range = new Range(0,10,2);
range.toList(); // [0,2,4,6,8]

14
public int[] range(int start, int stop)
{
   int[] result = new int[stop-start];

   for(int i=0;i<stop-start;i++)
      result[i] = start+i;

   return result;
}

構文やスタイルのエラーを許してください。私は通常C#でプログラミングします。


Vivien Barousseが答えにあなたを打ち負かしたので、重複を避けるためにあなたを削除してみませんか。もちろん、本当にうまく肉付けするつもりでない限り。
aaronasterling 2010

9
それらは似ています。私はもう少し読みやすいと思います。彼の「長さ」の使用は誤解を招くものであり、私は彼がPythonの仕様を満たしているとは思いません(彼には上限が含まれていますが、network-theory.co.uk / docs / pytut / rangeFunction.htmlはPythonでは起こらないと言っています) )。だまされたと思うなら、自分で対処するのに十分な評判があると思います。
KeithS

10

整数の範囲セットを取得するには、次のコードスニペットを使用できます。

    Set<Integer> iset = IntStream.rangeClosed(1, 5).boxed().collect
            (Collectors.toSet());

7
public int[] range(int start, int length) {
    int[] range = new int[length - start + 1];
    for (int i = start; i <= length; i++) {
        range[i - start] = i;
    }
    return range;
}

(「いいえ」と言うだけの長い回答)


また、Python 3の「範囲」とPython 2の優先「xrange」が、含まれる各アイテムのメモリを消費しない「ライブ」オブジェクトを返すことも確認してください。それはJavaで実装するためにさらに大きくなるでしょう。
jsbueno

3

Java 9- IntStream::iterate

Java 9以降でIntStream::iterateは、ステップを使用してカスタマイズすることもできます。たとえば、int配列が必要な場合:

public static int[] getInRange(final int min, final int max, final int step) {
    return IntStream.iterate(min, i -> i < max, i -> i + step)
            .toArray();
}

またはList

public static List<Integer> getInRange(final int min, final int max, final int step) {
    return IntStream.iterate(min, i -> i < max, i -> i + step)
            .boxed()
            .collect(Collectors.toList());
}

そしてそれを使います:

int[] range = getInRange(0, 10, 1);



1

Pythonループと同じように使用する場合、Javaはforステートメントを使用してうまくループします。これにより、この構造はその目的には不要になります。


5
通常、Pythonのループにも使用しません。ほとんどの場合、より簡潔な反復方法があります。
Daenyth、

まあ、範囲は通常forループで使用されます。しかし、forループは範囲なしで使用されることがよくあります。
FogleBird 2010


0

私はこれが古い投稿であることを知っていますが、オブジェクトストリームを返し、追加の依存関係を使用したくない、または使用できないソリューションを探している場合:

Stream.iterate(start, n -> n + 1).limit(stop);

開始 -包括的 停止 -排他的

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.