对于类似循环的Python范围函数

时间:2013-05-15 16:13:51

标签: java python function for-loop

我想知道在Java中是否有类似python范围函数的函数。

range(4)

它会返回

[0,1,2,3]

这是增强循环的简便方法。在Java中执行此操作会很棒,因为它会使循环变得更容易。这可能吗?

9 个答案:

答案 0 :(得分:34)

Java 8添加了IntStream(类似于apache commons IntRange),因此您现在不需要外部库。

IntStream.range(0, 3).forEachOrdered(n -> {
    //work on n here
});
如果订单不重要,也可以使用

forEach代替forEachOrdered

答案 1 :(得分:17)

如果没有外部库,您可以执行以下操作。对于大范围,它将比当前接受的答案消耗更少的内存,因为没有创建数组。

有这样的课程:

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

正如Henry Keiter在下面的评论中指出的那样,我们可以将以下方法添加到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);
}

答案 2 :(得分:11)

使用Apache Commons Lang

new IntRange(0, 3).toArray();

我通常不会主张将外部库引入如此简单的东西,但是Apache Commons的使用非常广泛,你可能已经在项目中使用了它!

编辑:我知道它不一定像for循环一样简单或快速,但是它的一点点语法糖使得意图清晰。

编辑:在Java 8中使用IntStream查看@ zengr的answer

答案 3 :(得分:9)

嗯...... for (int i = 0; i < k; i++)?你知道,你不必整天都在编写增强的for循环,尽管它们很酷......

只是为了争论:

for (int i : range(k))字数:22

for (int i = 0; i < k; i++)字数:27

range的实施进行折扣,它甚至是假的。

答案 4 :(得分:3)

如果你真的想要在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。

答案 5 :(得分:1)

它没有那么真实。但是你制作一个静态方法并使用它 -

public static int[] range(int index){
    int[] arr = new int[index];
    for(int i=0;i<index;i++){
        arr[i]=i;
    }
    return arr;
}

答案 6 :(得分:0)

没有Java等同于range函数,但有一个enhanced for-loop

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
}

答案 7 :(得分:0)

据我所知,java中没有等效的功能。但你可以自己写一下:

public static int[] range(int n) {
    int[] ans = new int[n];
    int i;
    for(i = 0; i < n; i++) {
        ans[i] = i;
    }
    return ans;
}

答案 8 :(得分:0)

您可以使用以下代码完成替换java中python中的范围的操作。注意:我不是要退出您的代码,我只是编写一小段代码并将其展示给您。

在python中,您会这样做。

if -2 <= x <= 10:
     print(x) 

在Java中,您可以替换此范围并执行。 。 ..

if(x >= -2 && x <= 10){
System.out.println("x")
}

通过在Java中执行上述代码,您不需要范围,但是您拥有 -2 <= x <= 10范围并将其分为x> = -2和x <=10。这意味着相同的意思,但是我在Java中解释的内容可能会使编译器花费更长的时间才能读取。因此,如果您使用的是python,请使用前者的代码格式;如果使用的是java,请使用后者的代码格式。