Вы имеете в виду диапазон Python 2.x, который возвращает список, или диапазон Python 3.x, который возвращает итератор (эквивалентный диапазону 2.x xrange)? Первый вариант относительно прост в реализации, как и другие, описанные ниже, но версия с итератором немного сложнее.
Мне жаль, что я не видел этого, прежде чем я реализовал свой собственный общий диапазон. Это приятно, но это еще одно напоминание о том, насколько неуклюжая Java может быть сравнена с более функциональными языками.
z7sg Ѫ
14
Range#asSetпохоже, устарело. Теперь вам нужно сделать это:ContiguousSet.create(Range.closed(low, high), DiscreteDomain.integers())
Chthonic Project
какую библиотеку мне нужно импортировать, чтобы использовать это?
tgabb
Начиная с Java 8, IntStream и LongStream имеют методы range и rangeClosed.
Хосе Мануэль Гомес Альварес
225
Старый вопрос, новый ответ (для Java 8)
IntStream.range(0,10).forEach(
n ->{System.out.println(n);});
Я работаю над небольшой библиотекой утилит Java под названием Jools , и она содержит класс, Rangeкоторый обеспечивает необходимую вам функциональность (есть загружаемый JAR).
Конструкторы либо Range(int stop), Range(int start, int stop)или Range(int start, int stop, int step)(подобно к для цикла) , и вы можете либо итерацию через него, которые используются ленивые вычисления, или вы можете использовать его toList()метод явно получить список диапазона.
for(int i :newRange(10)){...}// i = 0,1,2,3,4,5,6,7,8,9for(int i :newRange(4,10)){...}// i = 4,5,6,7,8,9for(int i :newRange(0,10,2)){...}// i = 0,2,4,6,8Range range =newRange(0,10,2);
range.toList();// [0,2,4,6,8]
учитывая, что Вивьен Барусс опередила вас с ответом, почему бы вам не удалить свой, чтобы избежать дублирования. Если, конечно, вы действительно не планируете красиво его воплощать.
aaronasterling,
9
Они похожи; Думаю, мой немного читабельнее. Его использование «длины» вводит в заблуждение, и я не думаю, что он соответствует спецификации Python (он включает верхнюю границу, которая, по словам network-theory.co.uk/docs/pytut/rangeFunction.html , не встречается в Python ). Если вы думаете, что это обман, я считаю, что у вас достаточно репутации, чтобы справиться с этим самостоятельно.
KeithS
10
Вы можете использовать следующий фрагмент кода, чтобы получить диапазон целых чисел:
Также обратите внимание, что «диапазон» в Python 3 и предпочтительный «xrange» в Python 2 возвращают «живой» объект, который не использует память для каждого содержащегося в нем элемента. Это было бы еще больше для реализации на Java.
Начиная с Java 9 вы можете использовать IntStream::iterateи даже можете настроить шаг. Например, если вам нужен intмассив:
publicstaticint[] getInRange(finalint min,finalint max,finalint step){returnIntStream.iterate(min, i -> i < max, i -> i + step).toArray();}
или List:
publicstaticList<Integer> getInRange(finalint min,finalint max,finalint step){returnIntStream.iterate(min, i -> i < max, i -> i + step).boxed().collect(Collectors.toList());}
Библиотека «Функциональная Java» позволяет программировать таким образом в ограниченной степени, она имеет метод range (), создающий экземпляр fj.data.Array.
Если вы хотите использовать его, как в цикле Python, Java прекрасно зацикливается с оператором for, который делает эту структуру ненужной для этой цели.
Было бы полезно, если бы вы объяснили, как этот код решает проблему.
Роберт Колумбия
0
Я знаю, что это старый пост, но если вы ищете решение, которое возвращает поток объектов и не хотите или не можете использовать какие-либо дополнительные зависимости:
Comparable
s см. Этот ответОтветы:
Guava также предоставляет нечто похожее на Python
range
:Вы также можете реализовать довольно простой итератор, чтобы делать то же самое, используя AbstractIterator Guava:
источник
Range#asSet
похоже, устарело. Теперь вам нужно сделать это:ContiguousSet.create(Range.closed(low, high), DiscreteDomain.integers())
Старый вопрос, новый ответ (для Java 8)
или со ссылками на методы:
источник
Начиная с Guava 15.0, Range.asSet () устарел, и его планируется удалить в версии 16. Используйте вместо этого следующее:
источник
Я работаю над небольшой библиотекой утилит Java под названием Jools , и она содержит класс,
Range
который обеспечивает необходимую вам функциональность (есть загружаемый JAR).Конструкторы либо
Range(int stop)
,Range(int start, int stop)
илиRange(int start, int stop, int step)
(подобно к для цикла) , и вы можете либо итерацию через него, которые используются ленивые вычисления, или вы можете использовать егоtoList()
метод явно получить список диапазона.источник
Простите за любые синтаксические или стилистические ошибки; Обычно я программирую на C #.
источник
Вы можете использовать следующий фрагмент кода, чтобы получить диапазон целых чисел:
источник
(Длинный ответ, чтобы просто сказать «Нет»)
источник
Java 9 -
IntStream::iterate
Начиная с Java 9 вы можете использовать
IntStream::iterate
и даже можете настроить шаг. Например, если вам нуженint
массив:или
List
:А потом используйте это:
источник
Изящный класс Groovy Range можно использовать из Java, хотя он, конечно, не так хорош.
источник
Библиотека «Функциональная Java» позволяет программировать таким образом в ограниченной степени, она имеет метод range (), создающий экземпляр fj.data.Array.
Видеть:
Точно так же библиотека «Totally Lazy» предлагает метод отложенного диапазона: http://code.google.com/p/totallylazy/
источник
Если вы хотите использовать его, как в цикле Python, Java прекрасно зацикливается с оператором for, который делает эту структуру ненужной для этой цели.
источник
источник
Я знаю, что это старый пост, но если вы ищете решение, которое возвращает поток объектов и не хотите или не можете использовать какие-либо дополнительные зависимости:
начало - включительно стоп - исключительное
источник