Подтвердить что ты не робот

Java: эквивалент диапазона Python (int, int)?

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

4b9b3361

Ответ 1

Guava также предоставляет нечто похожее на Python range:

Range.closed(1, 5).asSet(DiscreteDomains.integers());

Вы также можете реализовать довольно простой итератор, чтобы делать то же самое, используя Guava AbstractIterator:

return new AbstractIterator<Integer>() {
  int next = getStart();

  @Override protected Integer computeNext() {
    if (isBeyondEnd(next)) {
      return endOfData();
    }
    Integer result = next;
    next = next + getStep();
    return result;
  }
};

Ответ 2

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

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

или с помощью ссылок на методы:

IntStream.range(0, 10).forEach(System.out::println);

Ответ 3

Я работаю над небольшой библиотекой Java utils под названием 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]

Ответ 4

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

ContiguousSet.create(Range.closed(1, 5), DiscreteDomain.integers());

Ответ 5

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;
}

Простить любые ошибки синтаксиса или стиля; Я обычно программирую на С#.

Ответ 6

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

    Set<Integer> iset = IntStream.rangeClosed(1, 5).boxed().collect
            (Collectors.toSet());

Ответ 7

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;
}

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

Ответ 8

Groovy nifty Класс диапазона можно использовать с Java, хотя это, конечно, не как groovy.

Ответ 9

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

См:

Аналогично, библиотека "Полностью ленивая" предлагает метод ленивого диапазона: http://code.google.com/p/totallylazy/

Ответ 10

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

Ответ 11

Начиная с Java 9 вы можете использовать IntStream::iterate и даже настраивать шаг. Например, если вы хотите массив int:

public static int[] getInRange(final int min, final int max, final int step) {
    return IntStream.iterate(min, operand -> operand < max, operand -> operand + step)
            .toArray();
}

или List:

public static List<Integer> getInRange(final int min, final int max, final int step) {
    return IntStream.iterate(min, operand -> operand < max, operand -> operand + step)
            .boxed()
            .collect(Collectors.toList());
}

А затем используйте его:

int[] range = getInRange(0, 10, 1);