簡體   English   中英

For 循環 - 類似 Python 范圍函數

[英]For loop - like Python range function

我想知道在 Java 中是否有像 python range 函數這樣的函數。

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

如果順序forEachOrdered也可以使用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);
    }

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

嗯... for (int i = 0; i < k; i++) 你不必整天編寫增強的 for 循環,你知道,雖然它們很酷......

並且只是為了爭論:

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

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

打折range的實現,是偽偶數。

使用Apache Commons Lang

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

我通常不提倡為這么簡單的事情引入外部庫,但是 Apache Commons 的使用非常廣泛,以至於您可能已經在您的項目中使用了它!

編輯:我知道它不一定像 for 循環那樣簡單或快速,但它的一些語法糖可以使意圖清晰。

編輯:在 Java 8 中使用IntStream查看@zengr 的回答

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

它不是真的。 但是你創建了一個靜態方法並使用它 -

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

沒有與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
}

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

您可以使用以下代碼來替換 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,就用后者的代碼格式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM