Java có tương đương với range(int, int)phương thức của Python không?
Java có tương đương với range(int, int)phương thức của Python không?
Câu trả lời:
Ổi cũng cung cấp một cái gì đó tương tự như Python range:
Range.closed(1, 5).asSet(DiscreteDomains.integers());
Bạn cũng có thể triển khai một trình lặp khá đơn giản để làm điều tương tự bằng cách sử dụng AbstractIterator của Guava:
return new AbstractIterator<Integer>() {
int next = getStart();
@Override protected Integer computeNext() {
if (isBeyondEnd(next)) {
return endOfData();
}
Integer result = next;
next = next + getStep();
return result;
}
};
Range#asSetdường như đã trở nên không được chấp nhận. Bây giờ bạn cần phải làm điều này:ContiguousSet.create(Range.closed(low, high), DiscreteDomain.integers())
Câu hỏi cũ, câu trả lời mới (dành cho Java 8)
IntStream.range(0, 10).forEach(
n -> {
System.out.println(n);
}
);
hoặc với tham chiếu phương pháp:
IntStream.range(0, 10).forEach(System.out::println);
Kể từ Guava 15.0, Range.asSet () đã không còn được dùng nữa và được lên lịch để xóa trong phiên bản 16. Thay vào đó, hãy sử dụng cách sau:
ContiguousSet.create(Range.closed(1, 5), DiscreteDomain.integers());
Tôi đang làm việc trên một thư viện Java utils nhỏ có tên Jools , và nó chứa một lớp Rangecung cấp chức năng bạn cần (có một JAR có thể tải xuống).
Constructors là một trong hai Range(int stop), Range(int start, int stop)hoặc Range(int start, int stop, int step)(tương tự như một vòng lặp for) và bạn có thể lặp qua nó, mà sử dụng đánh giá lười biếng, hoặc bạn có thể sử dụng nó toList()phương pháp để rõ ràng có được danh sách phạm vi.
for (int i : new Range(10)) {...} // i = 0,1,2,3,4,5,6,7,8,9
for (int i : new Range(4,10)) {...} // i = 4,5,6,7,8,9
for (int i : new Range(0,10,2)) {...} // i = 0,2,4,6,8
Range range = new Range(0,10,2);
range.toList(); // [0,2,4,6,8]
public int[] range(int start, int stop)
{
int[] result = new int[stop-start];
for(int i=0;i<stop-start;i++)
result[i] = start+i;
return result;
}
Tha thứ cho bất kỳ lỗi cú pháp hoặc kiểu dáng nào; Tôi thường lập trình bằng C #.
public int[] range(int start, int length) {
int[] range = new int[length - start + 1];
for (int i = start; i <= length; i++) {
range[i - start] = i;
}
return range;
}
(Câu trả lời dài chỉ để nói "Không")
IntStream::iterateKể từ Java 9, bạn có thể sử dụng IntStream::iteratevà thậm chí bạn có thể tùy chỉnh bước. Ví dụ: nếu bạn muốn intmảng:
public static int[] getInRange(final int min, final int max, final int step) {
return IntStream.iterate(min, i -> i < max, i -> i + step)
.toArray();
}
hoặc List:
public static List<Integer> getInRange(final int min, final int max, final int step) {
return IntStream.iterate(min, i -> i < max, i -> i + step)
.boxed()
.collect(Collectors.toList());
}
Và sau đó sử dụng nó:
int[] range = getInRange(0, 10, 1);
Thư viện "Function Java" cho phép lập trình theo cách như vậy ở một mức độ hạn chế, nó có phương thức range () tạo ra một thể hiện fj.data.Array.
Xem:
Tương tự như vậy, thư viện "Hoàn toàn lười biếng" cung cấp phương pháp phạm vi lười biếng: http://code.google.com/p/totallylazy/
Nếu bạn muốn sử dụng nó như cách bạn làm trong vòng lặp Python, Java sẽ lặp lại một cách độc đáo với câu lệnh for, điều này khiến cấu trúc này không cần thiết cho mục đích đó.
IntStream.range(0, 10).boxed().collect(Collectors.toUnmodifiableList());