Java: эквивалент диапазона Python (int, int)? - PullRequest
90 голосов
/ 24 сентября 2010

Есть ли в Java эквивалент метода Python range(int, int)?

Ответы [ 10 ]

202 голосов
/ 07 апреля 2014

Старый вопрос, новый ответ (для Java 8)

    IntStream.range(0, 10).forEach(
        n -> {
            System.out.println(n);
        }
    );

или со ссылками на метод:

IntStream.range(0, 10).forEach(System.out::println);
24 голосов
/ 27 ноября 2012

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;
  }
};
15 голосов
/ 22 июля 2013

Начиная с Guava 15.0, Range.asSet () устарел и планируется удалить в версии 16. Вместо этого используйте следующее:

ContiguousSet.create(Range.closed(1, 5), DiscreteDomain.integers());
15 голосов
/ 29 сентября 2011

Я работаю над небольшой библиотекой утилит 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]
14 голосов
/ 24 сентября 2010
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 #.

8 голосов
/ 09 марта 2017

Вы можете использовать следующий фрагмент кода, чтобы получить диапазон целых чисел:

    Set<Integer> iset = IntStream.rangeClosed(1, 5).boxed().collect
            (Collectors.toSet());
5 голосов
/ 24 сентября 2010
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;
}

(Длинный ответ, чтобы просто сказать "Нет")

2 голосов
/ 15 сентября 2013

Библиотека «Функциональная Java» позволяет программировать таким способом в ограниченной степени, она имеет метод range (), создающий экземпляр fj.data.Array.

См:

Точно так же библиотека "Totally Lazy" предлагает метод ленивого диапазона: http://code.google.com/p/totallylazy/

2 голосов
/ 13 февраля 2013

Изящный Groovy Класс диапазона можно использовать из Java, хотя, конечно, он не такой отличный.

1 голос
/ 24 сентября 2010

Если вы хотите использовать его как в цикле Python, Java прекрасно зацикливается на операторе for, что делает эту структуру ненужной для этой цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...