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

Nic*_*ner 94 python java

Java是否具有Python range(int, int)方法的等价物?

jho*_*ges 211

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

    IntStream.range(0, 10).forEach(
        n -> {
            System.out.println(n);
        }
    );
Run Code Online (Sandbox Code Playgroud)

或方法参考:

IntStream.range(0, 10).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

  • @Justin那是java 8语言的特色. (6认同)

Sim*_*ele 25

Guava还提供类似Python的东西range:

Range.closed(1, 5).asSet(DiscreteDomains.integers());
Run Code Online (Sandbox Code Playgroud)

你也可以使用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;
  }
};
Run Code Online (Sandbox Code Playgroud)

  • `Range#asSet`似乎已被弃用.你现在需要这样做:`ContiguousSet.create(Range.closed(low,high),DiscreteDomain.integers())` (13认同)
  • 我希望在实现自己的通用范围之前我已经看过这个.这很不错,但还有一个提醒,即如何将笨重的Java与更多功能语言进行比较. (4认同)

jie*_*eng 16

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

ContiguousSet.create(Range.closed(1, 5), DiscreteDomain.integers());
Run Code Online (Sandbox Code Playgroud)


Kei*_*thS 15

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;
}
Run Code Online (Sandbox Code Playgroud)

原谅任何语法或样式错误; 我通常用C#编程.

  • 他们是相似的; 我觉得我的可读性更强一些.他使用"长度"是误导性的,我不认为他符合Python规范(他包括上限,http://www.network-theory.co.uk/docs/pytut/rangeFunction.html说在Python中不会发生).如果你认为一个人是骗子,我相信你有足够的声誉来自己处理它. (9认同)

Ami*_*hum 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]
Run Code Online (Sandbox Code Playgroud)


Jul*_*ian 9

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

    Set<Integer> iset = IntStream.rangeClosed(1, 5).boxed().collect
            (Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)


Viv*_*sse 6

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;
}
Run Code Online (Sandbox Code Playgroud)

(很长的回答只是说"不")