32

我想知道在 Java 中是否有像 python range 函数这样的函数。

range(4)

它会返回

[0,1,2,3]

这是一种增强循环的简单方法。在 Java 中这样做会很棒,因为它会使 for 循环更容易。这可能吗?

4

9 回答 9

62

Java 8(2014)添加了IntStream(类似于 apache commons IntRange),所以你现在不需要外部库。

import java.util.stream.IntStream; 

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

forEachforEachOrdered如果顺序不重要,可以使用too。

IntStream.range(0, 3).parallel()可用于 for 循环并行运行

于 2015-08-07T00:48:13.137 回答
22

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

有这样的课:

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);
}
于 2013-05-15T16:36:18.173 回答
13

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

只是为了争论:

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

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

不考虑 的实现range,它是伪偶数。

于 2013-05-15T16:15:17.147 回答
12

使用Apache Commons 语言

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

我通常不会提倡为如此简单的事情引入外部库,但是 Apache Commons 使用如此广泛,以至于您可能已经在您的项目中拥有它!

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

编辑:查看@zengr在 Java 8 中使用的答案。IntStream

于 2013-05-15T16:18:06.113 回答
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。

于 2013-05-15T16:17:02.967 回答
1

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

public static int[] range(int index){
    int[] arr = new int[index];
    for(int i=0;i<index;i++){
        arr[i]=i;
    }
    return arr;
}
于 2013-05-15T16:18:02.283 回答
0

没有与该range函数等效的 Java,但有一个增强的 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
}
于 2013-05-15T16:15:40.033 回答
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;
}
于 2013-05-15T16:19:16.290 回答
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,请使用后者的代码格式。

于 2020-11-29T00:08:43.867 回答