Comment pourrais-je écrire une méthode qui renvoie le poids moyen des boîtes d'un tableau. Supposons que les boîtes de tableau ont été construites. Ne peut pas non plus supposer que chaque élément du tableau a été construit. Si le tableau est vide, la méthode doit renvoyer 0.0. C'est ce que j'ai en ce moment mais je suis très perdu.
public class Question03 { //The array of boxes to be used by the method "getAverageWeight()" //This property is public for testing purposes public Box[] boxes; public double getAverageWeight() { int h = boxes.length; double avg = 0.0; for(int i = 0;i<boxes.length;i++) { if(boxes[i] == null) { h--; } } return avg; } }
5 Réponses :
"Continuer" si ce n'est pas construit et assurez-vous de faire la somme des poids
Ensuite, vous pouvez simplement renvoyer la somme de tous les poids divisée par le nombre de boîtes construites
Je vous suggère également de vous assurer d'éviter l'écart de 0 -> simple ajouter un contrôle si h == 0 et renvoyer 0 à la place
public double getAverageWeight() { int h = boxes.length; double sumWeight=0.0; for(int i = 0;i<boxes.length;i++) { if(boxes[i] == null) { h--; continue; } sumWeight+=boxes[i].getWeight(); } return sumWeight/h; }
cela fonctionne mais comment pourrais-je faire en sorte que si la valeur était nulle dans le tableau, elle serait définie sur 0,0?
Vous pouvez simplement créer une nouvelle boîte et définir la valeur à 0,0 à l'intérieur si les boîtes de condition [i] = nouvelle boîte (0,0); h--; continuer;
@ArvindKumarAvinash Bon point de votre part.
Ce serait beaucoup plus agréable de définir h = 0; vérifier! = null, mettre la somme + dans le if, et ainsi de suite ...
Très facile si vous utilisez des flux. average()
renvoie un OptionalDouble
afin que vous puissiez fournir une valeur par défaut si le tableau est vide.
Avg weight = 20.0
Tirages
double sum = 0; int count = 0; for (Box b : boxes) { if (b != null) { sum += b.getWeight(); count++; } } System.out.println("Avg weight = " + (sum/count));
ou plus traditionnellement
Avg weight = 20.0
Tirages
Box[] boxes = { new Box(10), new Box(20), null, null, new Box(30) }; double avg = Arrays.stream(boxes).filter(obj -> obj != null) .mapToDouble(Box::getWeight).average().orElse(0.); System.out.println("Avg weight = " + avg);
si vous préférez travailler avec des flux sur des boucles, alors ce serait une implémentation fonctionnelle:
public double getAverageWeight(Box[] boxes) { Collection<Box> noNulls = Arrays.stream(boxes) .filter(b -> b != null) .collect(Collectors.toList()); if (noNulls.isEmpty()) { return 0.0d; } double sum = noNulls.stream().map(b -> b.getWeight()).reduce(0.0d, (a,b) -> a+b); return sum / noNulls.size(); }
Vous pouvez le faire comme suit:
0
si le tableau est null
ou vide.h
dans le code ci-dessous) égale à la longueur du tableau et une autre (par exemple sum
dans le code ci-dessous) égale à 0
. Utilisez la variable, h
pour suivre les éléments non nuls tandis que sum
pour collecter le poids de tous les éléments non nuls.null
par une instance de Box
.sum / h
.Démo:
public double getAverageWeight() { // If the array is empty the method should return 0.0. if(boxes == null || boxes.length == 0) { return 0; } double sum = 0; int h = boxes.length; for(int i = 0; i < boxes.length; i++) { if(boxes[i] != null) { sum += boxes[i].weight;// Add the weight of each box to sum } else { boxes[i] = new Box();// Replace the null element with a Box object h--; } } // Return the average by dividing the sum by the count of boxes return sum / h; }
Je peux voir un vote défavorable. Je demande à l’électeur négatif de laisser un commentaire. Je promets de prendre vos commentaires de manière positive.
La solution la plus courte serait d'utiliser Streams
double avg = Arrays.stream(boxes) .filter(Objects::nonNull) .mapToDouble(Box::getWeight) .average() .orElse(0);
Cette question, ainsi que votre autre sur l’arithmétique avec des tableaux, me font penser que vous demandez à SO de vous aider à faire vos devoirs. Consultez les conseils pour le faire correctement ici: meta.stackoverflow.com/questions/334822/… . En gros, essayez d'abord quelque chose, puis postez une question sur la façon dont ce que vous avez essayé ne fonctionne pas.