Comment trouvez-vous la somme de tous les nombres dans un tableau en Java?
141
J'ai un problème pour trouver la somme de tous les nombres entiers dans un tableau en Java. Je ne trouve aucune méthode utile dans la Mathclasse pour cela.
Écrivez le vôtre, le code pour le faire fait 2-3 lignes.
wkl
2
Malheureusement, les "réponses" ci-dessus (et suivantes) sont "The Java Way": - / Vous pouvez utiliser la bibliothèque Functional Java , mais il est si compliqué de gérer la syntaxe Java.
1
Je sais que cette question est extrêmement ancienne, mais la réponse de msayag ci-dessous semble devoir être marquée comme réponse acceptée.
Matsu Q.
Le problème avec l'écriture que vous possédez est que c'est une boucle. Lorsque vous prenez une somme de 3 nombres, vous devriez pouvoir le faire en une seule instruction.
Que faire si le tableau contient de grands nombres et que la somme est hors de portée int?
thanhbinh84
5
Dans ce cas, vous pouvez utiliser LongStream, soit comme long sum = IntStream.of (a) .asLongStream (). Sum (); ou longue somme = LongStream.of (a) .sum ();
msayag
2
Y a-t-il un avantage de vitesse considérable à utiliser les flux?
mvorisek le
1
Si votre somme ne tient pas longtemps, vous devez faire la somme par paire (diviser et conquérir), car la somme de BigDecimals plus petits est plus rapide.
Si vous utilisez Java 8, la Arraysclasse fournit une stream(int[] array)méthode qui renvoie un séquentiel IntStreamavec le inttableau spécifié . Il a également été surchargé pour les tableaux doubleet long.
int[] arr ={1,2,3,4};int sum =Arrays.stream(arr).sum();//prints 10
int sum =Arrays.stream(newint[]{1,2,3,4},0,2).sum();//prints 3
Enfin, il peut prendre un tableau de type T. Ainsi, vous pouvez par exemple avoir un Stringqui contient des nombres en entrée et si vous voulez les additionner, faites simplement:
int sum =Arrays.stream("1 2 3 4".split("\\s+")).mapToInt(Integer::parseInt).sum();
classGauss{publicstaticvoid main(String[] args){int[] ia =newint[101];for(int i =0; i < ia.length; i++) ia[i]= i;int sum =0;for(int e : ia) sum += e;System.out.println(sum);}}
Vous pouvez le rendre encore plus agréable avec une boucle for-each (introduite dans Java 1.5).
wkl
6
Dans Java 8
Code :
int[] array =newint[]{1,2,3,4,5};int sum =IntStream.of(array).reduce(0,(a, b)-> a + b);System.out.println("The summation of array is "+ sum);System.out.println("Another way to find summation :"+IntStream.of(array).sum());
Sortie :
The summation of array is 15Another way to find summation :15
Explication :
Dans Java 8, vous pouvez utiliser le concept de réduction pour faire votre addition.
À mon humble avis, une fonction de somme semblerait un bon choix pour étendre la classe Arrays où le remplissage, le tri, la recherche, la copie et l'égalité vivent. Il y a beaucoup de méthodes pratiques cachées dans les javadocs, c'est donc une bonne question lors du portage de Fortran vers java de demander avant de lancer notre propre méthode d'aide. Recherchez dans l'énorme index javadoc "sum", "add" et tout autre mot-clé auquel vous pourriez penser. Vous pourriez penser que quelqu'un a déjà fait cela pour les types primitifs int, float, double, Integer, Float, Double? Aussi simple soit-il, il est toujours bon de vérifier. Gardez le code aussi simple que possible et ne réinventez pas la roue.
Vous devez rouler le vôtre.
Vous commencez avec un total de 0. Ensuite, vous considérez pour chaque entier du tableau, ajoutez-le à un total. Ensuite, lorsque vous êtes à court d'entiers, vous avez la somme.
S'il n'y avait pas d'entiers, le total est égal à 0.
Vous devez parcourir les éléments du tableau d'une manière ou d'une autre - vous pouvez le faire avec une boucle for ou une boucle while. Vous devez stocker le résultat de la sommation dans un accumulateur. Pour cela, vous devez créer une variable.
int accumulator =0;for(int i =0; i < myArray.length; i++){
accumulator += myArray[i];}
Vous pouvez améliorer l'apparence de votre code comme ceci:
publicvoid someMethod(){List<Integer> numbers =newArrayList<Integer>();
numbers.addAll(db.findNumbers());...System.out.println("Result is "+ sumOfNumbers(numbers));}privateint sumOfNumbers(List<Integer> numbers){int sum =0;for(Integer i : numbers){
sum += i;}return sum;}
Ça dépend. Combien de nombres ajoutez-vous? Tester plusieurs des suggestions ci-dessus:
import java.text.NumberFormat;import java.util.Arrays;import java.util.Locale;publicclassMain{publicstaticfinalNumberFormat FORMAT =NumberFormat.getInstance(Locale.US);publicstaticlong sumParallel(int[] array){finallong start =System.nanoTime();int sum =Arrays.stream(array).parallel().reduce(0,(a,b)-> a + b);finallong end =System.nanoTime();System.out.println(sum);return end - start;}publicstaticlong sumStream(int[] array){finallong start =System.nanoTime();int sum =Arrays.stream(array).reduce(0,(a,b)-> a + b);finallong end =System.nanoTime();System.out.println(sum);return end - start;}publicstaticlong sumLoop(int[] array){finallong start =System.nanoTime();int sum =0;for(int v: array){
sum += v;}finallong end =System.nanoTime();System.out.println(sum);return end - start;}publicstaticlong sumArray(int[] array){finallong start =System.nanoTime();int sum =Arrays.stream(array).sum();finallong end =System.nanoTime();System.out.println(sum);return end - start;}publicstaticlong sumStat(int[] array){finallong start =System.nanoTime();int sum =0;finallong end =System.nanoTime();System.out.println(sum);return end - start;}publicstaticvoid test(int[] nums){System.out.println("------");System.out.println(FORMAT.format(nums.length)+" numbers");long p = sumParallel(nums);System.out.println("parallel "+ FORMAT.format(p));long s = sumStream(nums);System.out.println("stream "+ FORMAT.format(s));long ar = sumArray(nums);System.out.println("arrays "+ FORMAT.format(ar));long lp = sumLoop(nums);System.out.println("loop "+ FORMAT.format(lp));}publicstaticvoid testNumbers(int howmany){int[] nums =newint[howmany];for(int i =0; i < nums.length;i++){
nums[i]=(i +1)%100;}
test(nums);}publicstaticvoid main(String[] args){
testNumbers(3);
testNumbers(300);
testNumbers(3000);
testNumbers(30000);
testNumbers(300000);
testNumbers(3000000);
testNumbers(30000000);
testNumbers(300000000);}}
J'ai trouvé, en utilisant une machine Ubuntu18 à 8 cœurs et 16 G, la boucle était la plus rapide pour les petites valeurs et le parallèle pour les plus grandes. Mais bien sûr, cela dépendra du matériel que vous utilisez:
staticint sum(){int sum =0;// initialize sumint i;// Iterate through all elements summing them upfor(i =0; i < arr.length; i++)
sum += arr[i];return sum;}
Il n'y a pas de «méthode dans une classe de mathématiques» pour une telle chose. Ce n'est pas comme si c'était une fonction racine carrée ou quelque chose comme ça.
Il vous suffit d'avoir une variable pour la somme et de parcourir le tableau en ajoutant chaque valeur trouvée à la somme.
classAddition{publicstaticvoid main(){int arr[]={5,10,15,20,25,30};//Declaration and Initialization of an Arrayint sum=0;//To find the sum of array elementsfor(int i:arr){
sum += i;}System.out.println("The sum is :"+sum);//To display the sum }}
Nous pouvons utiliser une fonction définie par l'utilisateur. Initialisez d'abord la variable de somme égale à zéro. Ensuite, parcourez le tableau et ajoutez l'élément avec la somme. Mettez ensuite à jour la variable de somme.
Extrait de code :
import java.util.*;import java.lang.*;import java.io.*;classSum{publicstaticint sum(int arr[]){int sum=0;for(int i=0; i<arr.length; i++){
sum += arr[i];}return sum;}publicstaticvoid main (String[] args){int arr[]={1,2,3,4,5};int total = sum(arr);System.out.printf("%d", total);}}
Un peu surpris de voir Aucune des réponses ci-dessus ne considère que l'utilisation d'un pool de threads peut être plusieurs fois plus rapide. Ici, parallelutilise un pool de threads fork-join et divise automatiquement le flux en plusieurs parties et les exécute en parallèle, puis fusionne. Si vous vous souvenez simplement de la ligne de code suivante, vous pouvez l'utiliser à de nombreux endroits.
Le prix du code court et doux le plus rapide est donc décerné à -
int[] nums ={1,2,3};int sum =Arrays.stream(nums).parallel().reduce(0,(a,b)-> a+b);
Disons que vous voulez faire sum of squares, alors Arrays.stream (nums) .parallel (). Map (x-> x * x) .reduce (0, (a, b) -> a + b). L'idée est que vous pouvez toujours effectuer une réduction, sans carte.
Pas forcément le plus rapide. Loop surclassera le petit N. Voir mon article plus long avec des détails.
gerardw
-1
publicclassNum1{publicstaticvoid main (){//Declaration and Initializationint a[]={10,20,30,40,50}//To find the sum of array elementsint sum=0;for(int i=0;i<a.length;i++){
sum=sum+i;}//To display the sumSystem.out.println("The sum is :"+sum);}}
publicclassAddDemo{publicstaticvoid main(String[] args){ArrayList<Integer>A =newArrayList<Integer>();Scanner S =newScanner(System.in);System.out.println("Enter the Numbers: ");for(int i=0; i<5; i++){
A.add(S.nextInt());}System.out.println("You have entered: "+A);intSum=0;for(int i=0; i<A.size(); i++){Sum=Sum+ A.get(i);}System.out.println("The Sum of Entered List is: "+Sum);}}
Depuis Java 8 L'utilisation d'expressions lambda est devenue disponible.
Regarde ça:
int[] nums =/** Your Array **/;
Compact:
int sum =0;Arrays.asList(nums).stream().forEach(each ->{
sum += each;});
Préférer:
int sum =0;ArrayList<Integer> list =newArrayList<Integer>();for(int each : nums){//refer back to original array
list.add(each);//there are faster operations…}
list.stream().forEach(each ->{
sum += each;});
Réponses:
Dans java-8 vous pouvez utiliser des flux:
Production:
La somme est de 150.
C'est dans le paquet
java.util.stream
la source
java.util.stream.DoubleStream.of(a).sum();
Si vous utilisez Java 8, la
Arrays
classe fournit unestream(int[] array)
méthode qui renvoie un séquentielIntStream
avec leint
tableau spécifié . Il a également été surchargé pour les tableauxdouble
etlong
.Il fournit également une méthode
stream(int[] array, int startInclusive, int endExclusive)
qui vous permet de prendre une plage spécifiée du tableau (ce qui peut être utile):Enfin, il peut prendre un tableau de type
T
. Ainsi, vous pouvez par exemple avoir unString
qui contient des nombres en entrée et si vous voulez les additionner, faites simplement:la source
C'est l'une de ces choses simples qui n'existent pas (AFAIK) dans l'API Java standard. C'est assez facile d'écrire le vôtre.
D'autres réponses sont parfaitement bien, mais en voici une avec du sucre syntaxique pour chaque.
En outre, un exemple de sommation de tableau est même présenté dans la spécification du langage Java 7 . L'exemple est tiré de la Section 10.4 - Accès aux tableaux .
la source
Vous ne pouvez pas. D'autres langages ont des méthodes pour cela comme array_sum () en PHP, mais pas Java.
Juste..
la source
Dans Apache Math: il y a
StatUtils.sum(double[] arr)
la source
Le seul point que j'ajouterais aux solutions précédentes est que j'utiliserais un long pour accumuler le total pour éviter tout débordement de valeur.
la source
la source
Dans
Java 8
Code :
Sortie :
Explication :
Dans
Java 8
, vous pouvez utiliser le concept de réduction pour faire votre addition.Tout savoir sur la réduction
la source
la source
À mon humble avis, une fonction de somme semblerait un bon choix pour étendre la classe Arrays où le remplissage, le tri, la recherche, la copie et l'égalité vivent. Il y a beaucoup de méthodes pratiques cachées dans les javadocs, c'est donc une bonne question lors du portage de Fortran vers java de demander avant de lancer notre propre méthode d'aide. Recherchez dans l'énorme index javadoc "sum", "add" et tout autre mot-clé auquel vous pourriez penser. Vous pourriez penser que quelqu'un a déjà fait cela pour les types primitifs int, float, double, Integer, Float, Double? Aussi simple soit-il, il est toujours bon de vérifier. Gardez le code aussi simple que possible et ne réinventez pas la roue.
la source
J'aime cette méthode personnellement. Mon style de code est un peu bizarre.
Assez facile à utiliser dans le code:
la source
J'utilise ceci:
la source
Vous devez rouler le vôtre.
Vous commencez avec un total de 0. Ensuite, vous considérez pour chaque entier du tableau, ajoutez-le à un total. Ensuite, lorsque vous êtes à court d'entiers, vous avez la somme.
S'il n'y avait pas d'entiers, le total est égal à 0.
la source
Il y a deux choses à apprendre de cet exercice:
Vous devez parcourir les éléments du tableau d'une manière ou d'une autre - vous pouvez le faire avec une boucle for ou une boucle while. Vous devez stocker le résultat de la sommation dans un accumulateur. Pour cela, vous devez créer une variable.
la source
Vous pouvez améliorer l'apparence de votre code comme ceci:
la source
Ça dépend. Combien de nombres ajoutez-vous? Tester plusieurs des suggestions ci-dessus:
J'ai trouvé, en utilisant une machine Ubuntu18 à 8 cœurs et 16 G, la boucle était la plus rapide pour les petites valeurs et le parallèle pour les plus grandes. Mais bien sûr, cela dépendra du matériel que vous utilisez:
la source
Il existe une méthode sum () dans la bibliothèque underscore-java .
Exemple de code:
la source
Utilisez la logique ci-dessous:
la source
Il n'y a pas de «méthode dans une classe de mathématiques» pour une telle chose. Ce n'est pas comme si c'était une fonction racine carrée ou quelque chose comme ça.
Il vous suffit d'avoir une variable pour la somme et de parcourir le tableau en ajoutant chaque valeur trouvée à la somme.
la source
la source
Nous pouvons utiliser une fonction définie par l'utilisateur. Initialisez d'abord la variable de somme égale à zéro. Ensuite, parcourez le tableau et ajoutez l'élément avec la somme. Mettez ensuite à jour la variable de somme.
Extrait de code :
la source
la source
Un peu surpris de voir Aucune des réponses ci-dessus ne considère que l'utilisation d'un pool de threads peut être plusieurs fois plus rapide. Ici,
parallel
utilise un pool de threads fork-join et divise automatiquement le flux en plusieurs parties et les exécute en parallèle, puis fusionne. Si vous vous souvenez simplement de la ligne de code suivante, vous pouvez l'utiliser à de nombreux endroits.Disons que vous voulez faire
sum of squares
, alors Arrays.stream (nums) .parallel (). Map (x-> x * x) .reduce (0, (a, b) -> a + b). L'idée est que vous pouvez toujours effectuer une réduction, sans carte.la source
la source
la source
Depuis Java 8 L'utilisation d'expressions lambda est devenue disponible.
Regarde ça:
Compact:
Préférer:
Retourner ou imprimer la somme.
la source