range(4)
而且它会返回
[0,1,2,3]
这是一种简单的方法,用于增强循环。如果能在Java中实现这个,那将会大大简化for循环。这可行吗?
Java 8 (2014) 新增了 IntStream(类似于 apache commons 的 IntRange),因此现在不需要外部库。
import java.util.stream.IntStream;
IntStream.range(0, 3).forEachOrdered(n -> {
System.out.println(n);
});
forEach
如果顺序不重要,也可以代替forEachOrdered
使用。
IntStream.range(0, 3).parallel()
可用于并行运行循环。
没有外部库,你可以做到以下几点。与当前已被接受的答案不同,它不会创建任何数组,在处理大型范围时将显著降低内存消耗。
创建一个如下的类:
class Range implements Iterable<Integer> {
private int limit;
public Range(int limit) {
this.limit = limit;
}
@Override
public Iterator<Integer> iterator() {
final int max = limit;
return new Iterator<Integer>() {
private int current = 0;
@Override
public boolean hasNext() {
return current < max;
}
@Override
public Integer next() {
if (hasNext()) {
return current++;
} else {
throw new NoSuchElementException("Range reached the end");
}
}
@Override
public void remove() {
throw new UnsupportedOperationException("Can't remove values from a Range");
}
};
}
}
您可以像这样简单地使用它:
for (int i : new Range(5)) {
System.out.println(i);
}
您甚至可以重复使用它:
Range range5 = new Range(5);
for (int i : range5) {
System.out.println(i);
}
for (int i : range5) {
System.out.println(i);
}
Range
类(或任何其他位置)中添加以下方法:public static Range range(int max) {
return new Range(max);
}
import static package.name.Range.range;
并简单地调用
for (int i : range(5)) {
System.out.println(i);
}
public static Range range(int max) { return new Range(max); }
,这样你的循环就变成了 for (int i : range(5)) {}
。 - Henry Keiter嗯...for (int i = 0; i < k; i++)
?你不必整天写增强型的for循环,虽然它们很酷...
为了论证而已:
for (int i : range(k))
字符数:22
for (int i = 0; i < k; i++)
字符数:27
不考虑实现的range
,两者几乎一样。
new IntRange(0, 3).toArray();
我通常不会建议为了这么简单的事情引入外部库,但是Apache Commons已经被广泛使用,你可能已经在你的项目中使用了它!
编辑:我知道这不一定像for循环那样简单或快速,但这是一种使意图清晰的语法糖。
编辑:参见@zengr的答案,使用Java 8中的IntStream
。
如果你真的非常想在Java中获得相同的结果,你需要做更多的工作:
public int[] range(int start, int end, int step) {
int n = (int) Math.ceil((end-start)/(double)step);
int[] arange = new int[n];
for (int i = 0; i < n; i++)
arange[i] = i*step+start;
return arange;
}
range(0, 4, 1)
将会返回期望的值,就像 Python 一样: [0, 1, 2, 3]
。可惜在 Java 中没有更简单的方法,它不像 Python 那样具有表达力。int[] range = range(5, 33, 5); System.out.println(Arrays.toString(range));
。 - jlordo这并不是真的可用。但你可以创建一个静态方法并使用它 -
public static int[] range(int index){
int[] arr = new int[index];
for(int i=0;i<index;i++){
arr[i]=i;
}
return arr;
}
Integer.MAX_VALUE
的话,那将会创建一个巨大的数组 ;) - jlordoJava中没有与range
函数相对应的函数,但有一个增强型for循环:
for (String s : strings) {
// Do stuff
}
如果你真的很喜欢这种语法,你也可以自己编写range
函数,但这似乎有点傻。
public static int[] range(int length) {
int[] r = new int[length];
for (int i = 0; i < length; i++) {
r[i] = i;
}
return r;
}
// ...
String s;
for (int i : range(arrayOfStrings.length)) {
s = arrayOfStrings[i];
// Do stuff
}
Integer.MAX_VALUE
的话,那将会创建一个巨大的数组 ;) - jlordorange()
方法中的所有其他选项,并且使用更少的内存;)感谢 +1。 - jlordopublic static int[] range(int n) {
int[] ans = new int[n];
int i;
for(i = 0; i < n; i++) {
ans[i] = i;
}
return ans;
}
Integer.MAX_VALUE
的话,那将会创建一个巨大的数组 ;) - jlordorange()
函数也会这样。 - Barranka你可以用以下代码在Java中替换Python中的range。注意:我不是根据你的代码,我只是写了一小段代码并向你展示。
在Python中,你会这样做...
if -2 <= x <= 10:
print(x)
在Java中,您可以替换此范围并执行...
if(x >= -2 && x <= 10){
System.out.println("x")
}
range(,,)
的等效功能有何关联。您可能希望通过更直接地将其与特定问题相关联来加强您的答案。 - piterbarg
Comparable
的范围,请参见此答案。 - c0der