[英]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
的實現,是偽偶數。
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.