For loop - like Python range function

61,528

Solution 1

Java 8 (2014) has added IntStream (similar to apache commons IntRange), so you don't need external lib now.

import java.util.stream.IntStream; 

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

forEach can be used in place of forEachOrdered too if order is not important.

IntStream.range(0, 3).parallel() can be used for loops to run in parallel

Solution 2

Without an external library, you can do the following. It will consume significantly less memory for big ranges than the current accepted answer, as there is no array created.

Have a class like this:

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

and you can simply use it like this:

    for (int i : new Range(5)) {
        System.out.println(i);
    }

you can even reuse it:

    Range range5 = new Range(5);

    for (int i : range5) {
        System.out.println(i);
    }
    for (int i : range5) {
        System.out.println(i);
    }

As Henry Keiter pointed out in the comment below, we could add following method to the Range class (or anywhere else):

public static Range range(int max) {
    return new Range(max);
}

and then, in the other classes we can

import static package.name.Range.range;

and simply call

for (int i : range(5)) {
    System.out.println(i);
}

Solution 3

Um... for (int i = 0; i < k; i++)? You don't have to write enhanced for loops all day, you know, although they are cool...

And just for the sake of argument:

for (int i : range(k)) char count: 22

for (int i = 0; i < k; i++) char count: 27

Discounting the implementation of range, it is pseudo even.

Solution 4

Use Apache Commons Lang:

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

I wouldn't normally advocate introducing external libraries for something so simple, but Apache Commons are so widely used that you probably already have it in your project!

Edit: I know its not necessarily as simple or fast as a for loop, but its a nice bit of syntactic sugar that makes the intent clear.

Edit: See @zengr's answer using IntStream in Java 8 .

Solution 5

If you really, really want to obtain an equivalent result in Java, you'll have to do some more work:

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

Now range(0, 4, 1) will return the expected value, just like Python: [0, 1, 2, 3]. Sadly there isn't a simpler way in Java, it's not a very expressive language, like Python.

Share:
61,528
Kacper Lubisz
Author by

Kacper Lubisz

Updated on July 24, 2022

Comments

  • Kacper Lubisz
    Kacper Lubisz almost 2 years

    I was wondering if in Java there is a function like the python range function.

    range(4)
    

    and it would return

    [0,1,2,3]
    

    This was an easy way to make for enhanced loops. It would be great to do this in Java because it would make for loops a lot easier. Is this possible?