Чи має Java еквівалент range(int, int)методу Python ?
Чи має Java еквівалент range(int, int)методу Python ?
Відповіді:
Guava також пропонує щось подібне до Python range:
Range.closed(1, 5).asSet(DiscreteDomains.integers());
Ви також можете реалізувати досить простий ітератор, щоб зробити те ж саме, використовуючи AbstractIterator 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#asSetначебто, застаріла. Тепер вам потрібно зробити це:ContiguousSet.create(Range.closed(low, high), DiscreteDomain.integers())
Старе запитання, нова відповідь (для Java 8)
IntStream.range(0, 10).forEach(
n -> {
System.out.println(n);
}
);
або із посиланнями на методи:
IntStream.range(0, 10).forEach(System.out::println);
Оскільки Guava 15.0, Range.asSet () був застарілим і його планується видалити у версії 16. Використовуйте наступне:
ContiguousSet.create(Range.closed(1, 5), DiscreteDomain.integers());
Я працюю над невеликою бібліотекою Java утилітів під назвою Jools , і вона містить клас, Rangeякий забезпечує необхідну функціональність (є JAR, який можна завантажити).
Конструктори є або Range(int stop), Range(int start, int stop)або Range(int start, int stop, int step)(подібні до циклу for), і ви можете або повторити його, який використовував ледачу оцінку, або ви можете використовувати його toList()метод для явного отримання списку діапазонів.
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;
}
Пробачте будь-які синтаксичні чи стильові помилки; Я зазвичай програмую на 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;
}
(Довга відповідь, просто сказати "Ні")
IntStream::iterateОскільки Java 9 ви можете використовувати IntStream::iterateі ви навіть можете налаштувати крок. Наприклад, якщо ви хочете intмасив:
public static int[] getInRange(final int min, final int max, final int step) {
return IntStream.iterate(min, i -> i < max, i -> i + step)
.toArray();
}
або 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());
}
А потім скористайтеся ним:
int[] range = getInRange(0, 10, 1);
Бібліотека "Функціональна Java" дозволяє програмувати таким чином в обмеженому ступені, вона має метод range (), створюючи екземпляр fj.data.Array.
Побачити:
Аналогічно бібліотека "Цілком ледачий" пропонує метод лінивого діапазону: http://code.google.com/p/totallylazy/
Якщо ви маєте на увазі використовувати його так, як би ви працювали в циклі Python, Java добре ув'язується з оператором for, що робить цю структуру непотрібною для цієї мети.
IntStream.range(0, 10).boxed().collect(Collectors.toUnmodifiableList());