【问题标题】:For loop - like Python range functionFor 循环 - 类似于 Python 范围函数
【发布时间】:2013-05-15 16:13:50
【问题描述】:

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

range(4)

它会返回

[0,1,2,3]

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

【问题讨论】:

标签: java python function for-loop


【解决方案1】:

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() 可用于循环并行运行

【讨论】:

    【解决方案2】:

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

    有这样的课程:

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

    【讨论】:

    • +1 实际为此编写了一个迭代器!为了好玩:您可以使用简单的 getter 方法将其进一步包装为类似 Python 的语法:public static Range range(int max) { return new Range(max); },因此您的循环变为 for (int i : range(5)) {}
    • @HenryKeiter 这是一个很好的建议,我非常喜欢它,我会更新我的答案(并给你功劳)。
    • 这是一个很好的答案,但不是这个问题。它只是暗示'不,没有像 range 这样的函数,你必须实现自己的迭代器'。对不起,-1。
    【解决方案3】:

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

    只是为了争论:

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

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

    打折range的实现,是伪偶数。

    【讨论】:

    • 嗯,这是正常的做法,但如果你可以制作一个数组供循环使用,那就简单多了。
    • 不过,这不是他要问的;他想知道是否有“更简单”的方法。
    • @HenryKeiter:没错,只是试图反驳 OP 的论点:“在 java 中这样做会很棒,因为它会使 for 循环更容易”。
    • 好吧,我当然不能不同意你的看法。似乎只是为了节省几个字符(并忽略路上的所有约定)付出了很多努力,但我不是在这里判断人们可能想要使用什么(反)成语:)
    • @ExotickBoyPl 你可以让 somethink like 成为一个数组,如果你看看我的回答,效率会更高;)
    【解决方案4】:

    使用Apache Commons Lang:

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

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

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

    编辑:请参阅 @zengr 的 answer 在 Java 8 中使用 IntStream

    【讨论】:

    • 嗯,它不是,但我期待它是,它仍然知道
    • 这也会比传统的 for 循环慢很多。
    • 这个解决方案效率很低——你需要一个大范围的大数组。 Extending AbstractList 是我能想到的最简单有效的解决方案。
    【解决方案5】:

    如果您真的非常想在 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));
    【解决方案6】:

    它不可用。但是你制作了一个静态方法并使用它 -

    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的范围,这将创建一个巨大的数组;)
    • 你可以只检查你可用的主内存,甚至你可以添加更多呵呵:P
    【解决方案7】:

    据我所知,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;
    }
    

    【讨论】:

    • 如果你想要Integer.MAX_VALUE的范围,这将创建一个巨大的数组;)
    • @jlordo 如果你把它推到那个位置,是的,它会……python的range()函数也是如此
    • 这就是我喜欢Java的原因,因为它很容易拥有功能而无需使用那么多内存:)
    【解决方案8】:

    没有与range 函数等效的Java,但有一个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
    }
    

    【讨论】:

    • 如果你想要Integer.MAX_VALUE的范围,这将创建一个巨大的数组;)
    • @jlordo 嗯,这当然是真的 ;-) 但是 Python (2) 中的 range 函数也是如此,我觉得写一个 Iterator 只是为了避免写一个基本的循环(虽然你的答案是+1,但哈哈)。
    • 对于一个简单的循环来说肯定是矫枉过正。尽管您可以修改迭代器以使用 Python range() 方法具有的所有其他选项并且使用更少的内存;)感谢 +1
    【解决方案9】:

    你可以用下面的代码来替换java中python中的范围。注意:我不会关闭您的代码,我只是编写一小段代码并展示给您。

    在python中你会做...... .

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

    在 java 中,您将替换此范围并执行此操作。 . ..

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

    通过在 java 中执行上述代码,您不需要范围,但您有 -2 = -2 和 x

    【讨论】:

    • 欢迎来到 Stackoverflow 并祝贺您的​​第一个答案。在这里,我们试图将答案集中在所提出的具体问题上——目前尚不清楚您所写的内容与 Java 中是否存在与 range(,,) 等效的具体问题有何关系。您可能希望通过更直接地将其链接到特定问题来增强您的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 2016-10-31
    • 2018-12-20
    • 2022-12-16
    相关资源
    最近更新 更多