Функция диапазона PHP в Java - PullRequest
4 голосов
/ 26 октября 2010

Функция диапазона PHP работает так в php:

$leap_years = range(1900, 2000, 4);

создает массив как 1900, 1904, 1908, ... Есть ли что-то простое в Java?

Ответы [ 3 ]

4 голосов
/ 26 октября 2010

Для этого нет ничего встроенного, но относительно просто реализовать такой диапазон, как неизменяемый Iterable<Long> (или Integer или любой другой). Просто создайте пользовательский Iterator, который начинается с начального значения, а затем увеличивается для каждого вызова до next(), пока вы не передадите конечное значение. Вы должны решить, как и если вы хотите обрабатывать итерацию от высокого к низкому уровню и тому подобное, но это не сложно. Вы также можете сделать это как неизменяемую реализацию List, где значение для каждого индекса рассчитывается по требованию (start + index * increment).

Хотя ваш вопрос касается создания «массива» на основе диапазона, массив, полный данных по всему диапазону, часто не требуется, особенно если вы просто хотите перебирать числа в диапазоне. Если это все, что вам нужно, вы в конечном итоге перебираете числа в диапазоне дважды , чтобы создать массив или List, а затем читаете его. Использование итератора с отложенным диапазоном, как я описал, не имеет этого недостатка. Кроме того, ленивый итератор может быть легко скопирован в List, если вы хотите, чтобы все значения хранились непосредственно в памяти. Единственный недостаток по сравнению с созданием массива - некоторые накладные расходы на автобокс.

3 голосов
/ 26 октября 2010

Вы должны сделать это так:

public int[] range(int start, int end, int increment) {
   if (start < end && increment < 0) throw new IllegalArgumentException();
   if (start > end && increment > 0) throw new IllegalArgumentException();

   int[] values = new int[Math.abs((end - start) / increment) + 1];
   boolean reverse = start > end;

   for (int i = start, index = 0; reverse ? (i >= end) : (i <= end); i+=increment, ++index)
   {
       values[index] = i;
   }
   return values;
}
1 голос
/ 26 октября 2010

Вы можете смоделировать это так:

public int[] range(int startVal, int endVal, int increment) {
  if (startVal >= endVal) {
    //handle error or add option to go backwards
  }
  int count = ((endval - startval) / increment) + 1;
  int[] myArr = new int[count];
  for (int i=0; i <= count; i++) {
    myArr[i] = startVal + (i * increment);
  }
  return myArr;
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...