Java для приращения или уменьшения цикла на основе условия - PullRequest
1 голос
/ 11 ноября 2019

У меня есть два метода, которые идентичны, за исключением направления индекса цикла.

Цикл в methodA ожидает indexBegin < indexEnd, поэтому он увеличивает i с indexBegin до indexEnd.

Цикл в methodB ожидает indexBegin > indexEnd, поэтому он уменьшает i с indexBegin доindexEnd.

public void methodA(int indexBegin, int indexEnd, List<Double> values) {
 for (int i = indexBegin; i <= indexEnd; i++) {
  ...
 }
}

public void methodB(int indexBegin, int indexEnd, List<Double> values) {
 for (int i = indexBegin; i >= indexEnd; i--) {
  ...
 }
}

Есть ли способ консолидировать циклическую логику здесь с помощью Итератора, чтобы у меня был только один метод? Мне все еще нужно следить за индексами.

Ответы [ 3 ]

0 голосов
/ 11 ноября 2019

Вы можете выбрать индексы так, чтобы они всегда повторялись от нижней к верхней границе.

int begin = indexBegin > indexEnd ? indexEnd : indexBegin;
int end = indexBegin > indexEnd ? indexBegin: indexEnd;

for (int i = begin ; i <= end ; i++) {
  ...
}
0 голосов
/ 11 ноября 2019

Как насчет того, чтобы перейти к циклу while и объявить оба? Таким образом, вы можете получить доступ к любому из методов.

int countingUp = indexBegin;
int countingDown = indexEnd;

while (countingUp < indexEnd) {
  . . .

  countingUp++;
  countingDown--;

}
0 голосов
/ 11 ноября 2019

В java-8 вы можете использовать IntStream.iterate или Stream.iterate с комбинацией limit для генерации последовательности в порядке увеличения или уменьшения, так что вы можете иметь одинметод путем передачи IntStream в качестве аргумента

public void utilMethod(IntStream range, List<Double> values) {
   range.forEach(i->i);
 }

или

 public void utilMethod(Stream<Integer> range, List<Double> values) {
   range.forEach(i->i);
 }

Пример:

IntStream.iterate(0,i->i+1).limit(10).forEach(System.out::println);

IntStream.iterate(10,i->i-1).limit(10).forEach(System.out::println);

Из Java-9 вы можетеиспользуйте перегруженный IntStream.iterate или Stream.iterate для генерации последовательности в порядке увеличения или уменьшения

public void utilMethod(IntStream range, List<Double> values) {
   range.forEach(i->i);
 }

Пример

IntStream.iterate(0, i->i<10, i->i+1).forEach(System.out::println);

IntStream.iterate(10, i->i>0, i->i-1).forEach(System.out::println);
...