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

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

100053 次浏览
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;
}

(长答案只是说“不”)

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 # 编程。

如果您打算像在 Python 循环中那样使用它,那么 Java 循环与 for 语句很好地结合在一起,这使得这个结构对于这个目的是不必要的。

我正在开发一个名为 朱尔斯的 Java 实用程序库,它包含一个类 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]

Guava 还提供了一些类似于 Python 的 range的东西:

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

You can also implement a fairly simple iterator to do the same sort of thing using Guava's 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;
}
};

Groovy's nifty 靶场等级 can be used from Java, though it's certainly not as groovy.

自从番石榴15.0以来,Range. asSet ()已被弃用,并计划在版本16中删除。使用以下代替:

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

“ Functional Java”库在一定程度上允许以这样的方式编程,它有一个 range ()方法来创建 fj.data。数组实例。

See:

类似地,“纯惰性”库提供了一种惰性范围方法: Http://code.google.com/p/totallylazy/

Old question, new answer (for Java 8)

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

或方法参考:

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

You can use the following code snippet in order to get a range set of integers:

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

Java9-IntStream::iterate

因为 Java9可以使用 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);
IntStream.range(0, 10).boxed().collect(Collectors.toUnmodifiableList());

我知道这是一篇老文章,但如果你正在寻找一个解决方案,返回一个对象流,不想或不能使用任何额外的依赖:

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

开始 -包含 停止 -独占

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