4
votes

La moyenne des nombres pairs donne une valeur erronée

J'essaie de me rapprocher de la compréhension des flux, donc je fais quelques exercices de base. Dans celui-ci, j'aimerais calculer la moyenne des nombres impairs. J'ai écrit cet algorithme pour ce faire, mais il donne un résultat incorrect (8.0). J'ai essayé de le déboguer mais je n'ai pas trouvé ce qu'il fait réellement.

List<Integer> numbers = Arrays.asList(1, 3, -2, -4, -7, -3, -8, 12, 19, 6, 9, 10, 14);

OptionalDouble result = numbers.stream()
                               .filter(i -> i % 2 == 1)
                               .mapToDouble(i -> i).average();
if (result.isPresent()) {
   System.out.println(result);
} else {
   System.out.println("Error");
}

Que fait mon code maintenant? Comment dois-je le réparer pour faire ce qu'il est censé faire?


2 commentaires

Votre filtre ne retient que les nombres impairs positifs.


votre titre dit que vous voulez une moyenne de nombres pairs et votre description dit le contraire. Qu'est-ce que tu veux?


3 Réponses :


11
votes
(i -> i % 2 != 0)

0 commentaires

3
votes

Que fait mon code maintenant?

Vous effectuez une opération modulo sur un nombre négatif .

Comment dois-je le réparer pour faire ce qu'il est censé faire?

Vous pouvez utiliser Math.abs pour valider que la valeur absolue est impaire ou non dans votre liste:

OptionalDouble result = numbers.stream()
                .filter(i -> Math.abs(i) % 2 == 1) // verify id the absolute value is odd
                .mapToDouble(i->i).average();

1 commentaires

Merci beaucoup!