Java:Python的范围(int,int)的等价物?

时间:2010-09-24 19:04:51

标签: java python

Java是否与Python的range(int, int)方法等效?

14 个答案:

答案 0 :(得分:198)

旧问题,新答案(适用于Java 8)

    IntStream.range(0, 10).forEach(
        n -> {
            System.out.println(n);
        }
    );

或方法参考:

IntStream.range(0, 10).forEach(System.out::println);

答案 1 :(得分:24)

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;
  }
};

答案 2 :(得分:15)

我正在开发一个名为Jools的小型Java utils库,它包含一个类Range,它提供了您需要的功能(可下载的JAR)。
构造函数可以是Range(int stop)Range(int start, int stop)Range(int start, int stop, int step)(类似于for循环),您可以迭代它,使用惰性求值,也可以使用它{{1}显式获取范围列表的方法。

toList()

答案 3 :(得分:15)

自Guava 15.0起,Range.asSet()已被弃用,计划在版本16中删除。请改用以下内容:

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

答案 4 :(得分: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#编程。

答案 5 :(得分:8)

您可以使用以下代码段来获取整数范围:

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

答案 6 :(得分:5)

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;
}

(简直回答只是说“不”)

答案 7 :(得分:2)

Groovy的漂亮Range class可以在Java中使用,虽然它肯定不像groovy。

答案 8 :(得分:2)

“Functional Java”库允许以这种方式编程到有限的程度,它有一个range()方法创建一个fj.data.Array实例。

请参阅:

同样,“Totally Lazy”库提供了一个懒惰的范围方法: http://code.google.com/p/totallylazy/

答案 9 :(得分:1)

如果你的意思是像在Python循环中那样使用它,Java会很好地使用for语句循环,这样就不需要这个结构了。

答案 10 :(得分:1)

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);

答案 11 :(得分:1)

IntStream.range(0, 10).boxed().collect(Collectors.toUnmodifiableList());

答案 12 :(得分:0)

我知道这是一篇过时的文章,但是如果您正在寻找一种返回对象流且不希望或不能使用任何其他依赖项的解决方案,则:

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

开始-包括 停止-独家

答案 13 :(得分:0)

Java 8

private static int[] range(int start, int stop, int step) {
    int[] result = new int[(stop-start)%step == 0 ? (stop-start)/step : (stop-start)/step+1];
    int count = 0;
    Function<Integer, Boolean> condition = step > 0 ? (x) -> x < stop : (x) -> x > stop;
    for (int i = start; condition.apply(i); i += step) {
        result[count] = i;
        count++;
    }
    return result;
}