1
votes

Incrément ou décrémentation de boucle Java For en fonction de la condition

J'ai deux méthodes identiques à l'exception de la direction d'index de boucle.

La boucle dans methodA attend indexBegin donc elle incrémente i de indexBegin jusqu'à indexEnd.

La boucle dans methodB attend indexBegin> indexEnd pour qu'il décrémente i de 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--) {
  ...
 }
}

Y a-t-il un moyen de consolider la logique de boucle ici en utilisant un itérateur donc je n'ai qu'une seule méthode? J'ai encore besoin de garder une trace des index.


1 commentaires

Changez simplement les valeurs d'indexBegin et d'indexEnd ainsi que la valeur d'incrémentation?


4 Réponses :


1
votes

Dans java-8, vous pouvez utiliser IntStream.iterate ou Stream.iterate avec la combinaison de limit pour générer une séquence par incrément ou décrément order, vous pouvez donc avoir une méthode en passant IntStream comme argument

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

ou

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

Exemple:

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

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

À partir de java-9, vous pouvez utiliser IntStream.iterate ou Stream.iterate pour générer une séquence par incrément ou décrémentation

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

Exemple

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


0 commentaires

-1
votes

Vous pouvez sélectionner les indices de manière à toujours itérer de la limite inférieure à la limite supérieure.

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

for (int i = begin ; i <= end ; i++) {
  ...
}


0 commentaires

0
votes

Que diriez-vous de passer à une boucle while et de déclarer les deux? De cette façon, vous pouvez accéder à l'un ou l'autre dans la méthode.

int countingUp = indexBegin;
int countingDown = indexEnd;

while (countingUp < indexEnd) {
  . . .

  countingUp++;
  countingDown--;

}


0 commentaires

0
votes

Vous pouvez utiliser l'opérateur ternaire dans la boucle for comme ceci:

   public void method(int indexBegin, int indexEnd, List<Double> values) {
       int direction = indexEnd - indexBegin ;
       for (int i = indexBegin; direction > 0 ? i<=indexEnd : i>=indexEnd; i= direction>0 ? i+1:i-1) {
          ...
    }
  }


0 commentaires