Como você encontra a soma de todos os números em uma matriz em Java?
141
Estou tendo um problema para encontrar a soma de todos os números inteiros em uma matriz em Java. Não consigo encontrar nenhum método útil na Mathclasse para isso.
Escreva o seu, o código para fazer isso é de 2 a 3 linhas.
Wkl
2
Infelizmente, as "respostas" acima (e as seguintes) são "The Java Way": - / Você pode usar a biblioteca Java Funcional , mas é muito complicado lidar com a sintaxe Java.
1
Eu sei que esta pergunta é extremamente antiga, mas a resposta de msayag abaixo parece que deve ser marcada como resposta aceita.
Matsu P.
O problema com a escrita que você possui é que é um loop. Quando você pegar uma soma de 3 números, poderá fazê-lo em uma instrução.
Se você estiver usando o Java 8, a Arraysclasse fornece um stream(int[] array)método que retorna um seqüencial IntStreamcom a intmatriz especificada . Também foi sobrecarregado por doublee longmatrizes.
int[] arr ={1,2,3,4};int sum =Arrays.stream(arr).sum();//prints 10
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);}}
Você pode torná-lo ainda melhor com um loop for-each (introduzido no Java 1.5).
Wkl
6
No Java 8
Código :
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());
Saída :
The summation of array is 15Another way to find summation :15
Explicação :
Em Java 8, você pode usar o conceito de redução para fazer sua adição.
IMHO uma função soma pareceria um bom ajuste para estender a classe Arrays, onde preencher, classificar, pesquisar, copiar e igual a viver. Existem muitos métodos úteis ocultos nos javadocs, portanto, é uma boa pergunta ao enviar o Fortran ao java para perguntar antes de lançar nosso próprio método auxiliar. Pesquise no enorme índice javadoc por "sum", "add" e qualquer outra palavra-chave em que você possa imaginar. Você pode suspeitar que alguém já tenha feito isso para os tipos primitivos int, float, double, Inteiro, Float, Double? Não importa quão simples, é sempre bom verificar. Mantenha o código o mais simples possível e não reinvente a roda.
Você tem que rolar o seu próprio.
Você começa com um total de 0. Em seguida, considera todos os números inteiros da matriz e o adiciona a um total. Então, quando você estiver sem números inteiros, terá a soma.
Você precisa percorrer os elementos da matriz de alguma maneira - você pode fazer isso com um loop for ou um while. Você precisa armazenar o resultado da soma em um acumulador. Para isso, você precisa criar uma variável.
int accumulator =0;for(int i =0; i < myArray.length; i++){
accumulator += myArray[i];}
Você pode fazer com que seu código fique melhor assim:
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;}
Depende. Quantos números você está adicionando? Testando muitas das sugestões acima:
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);}}
Descobri que, usando uma máquina Ubuntu18 de 8 núcleos e 16 G, o loop era mais rápido para valores menores e o paralelo para maiores. Mas é claro que isso dependeria do hardware que você está executando:
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;}
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 }}
Podemos usar a função definida pelo usuário. Inicialmente, inicialize a variável soma igual a zero. Em seguida, percorra a matriz e adicione o elemento com soma. Atualize a variável sum.
Fragmento de código :
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);}}
Um pouco surpreso ao ver Nenhuma das respostas acima considera que pode ser várias vezes mais rápido usando um pool de threads. Aqui,parallel usa um conjunto de encadeamentos de junção de bifurcação e interrompe automaticamente o fluxo em várias partes e as executa paralelamente e depois mescladas. Se você se lembrar da seguinte linha de código, poderá usá-la em vários lugares.
Portanto, o prêmio pelo código curto e doce mais rápido vai para -
int[] nums ={1,2,3};int sum =Arrays.stream(nums).parallel().reduce(0,(a,b)-> a+b);
Digamos que você queira fazer sum of squares, e Arrays.stream (nums) .parallel (). Map (x-> x * x) .reduce (0, (a, b) -> a + b). A idéia é que você ainda pode executar reduzir, sem mapa.
Não necessariamente mais rápido. O loop terá um desempenho superior ao N. pequeno. Veja minha postagem mais longa com detalhes.
Gerardw 29/10/19
-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);}}
A partir do Java 8, o uso de expressões lambda tornou-se disponível.
Veja isso:
int[] nums =/** Your Array **/;
Compactar:
int sum =0;Arrays.asList(nums).stream().forEach(each ->{
sum += each;});
Preferir:
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;});
Respostas:
No java-8 você pode usar fluxos:
Resultado:
A soma é 150.
Está no pacote
java.util.stream
fonte
java.util.stream.DoubleStream.of(a).sum();
Se você estiver usando o Java 8, a
Arrays
classe fornece umstream(int[] array)
método que retorna um seqüencialIntStream
com aint
matriz especificada . Também foi sobrecarregado pordouble
elong
matrizes.Ele também fornece um método
stream(int[] array, int startInclusive, int endExclusive)
que permite que você pegue um intervalo especificado da matriz (que pode ser útil):Finalmente, pode levar uma matriz do tipo
T
. Assim, por exemplo, você pode ter umString
que contém números como entrada e, se quiser somar, basta:fonte
Essa é uma daquelas coisas simples que não existem (AFAIK) na API Java padrão. É fácil escrever o seu próprio.
Outras respostas são perfeitamente boas, mas aqui está uma com um pouco de açúcar sintático para cada um.
Além disso, um exemplo de soma de matriz é mostrado na especificação da linguagem Java 7 . O exemplo é da Seção 10.4 - Acesso à matriz .
fonte
Você não pode. Outras linguagens têm alguns métodos para isso, como array_sum () no PHP, mas Java não.
Somente..
fonte
No Apache Math: existe
StatUtils.sum(double[] arr)
fonte
O único ponto que eu acrescentaria às soluções anteriores é que usaria um longo para acumular o total para evitar qualquer excesso de valor.
fonte
fonte
No
Java 8
Código :
Saída :
Explicação :
Em
Java 8
, você pode usar o conceito de redução para fazer sua adição.Leia tudo sobre redução
fonte
fonte
IMHO uma função soma pareceria um bom ajuste para estender a classe Arrays, onde preencher, classificar, pesquisar, copiar e igual a viver. Existem muitos métodos úteis ocultos nos javadocs, portanto, é uma boa pergunta ao enviar o Fortran ao java para perguntar antes de lançar nosso próprio método auxiliar. Pesquise no enorme índice javadoc por "sum", "add" e qualquer outra palavra-chave em que você possa imaginar. Você pode suspeitar que alguém já tenha feito isso para os tipos primitivos int, float, double, Inteiro, Float, Double? Não importa quão simples, é sempre bom verificar. Mantenha o código o mais simples possível e não reinvente a roda.
fonte
Eu gosto desse método pessoalmente. Meu estilo de código é um pouco estranho.
Muito fácil de usar no código:
fonte
Eu uso isso:
fonte
Você tem que rolar o seu próprio.
Você começa com um total de 0. Em seguida, considera todos os números inteiros da matriz e o adiciona a um total. Então, quando você estiver sem números inteiros, terá a soma.
Se não houvesse números inteiros, o total é 0.
fonte
Há duas coisas a aprender com este exercício:
Você precisa percorrer os elementos da matriz de alguma maneira - você pode fazer isso com um loop for ou um while. Você precisa armazenar o resultado da soma em um acumulador. Para isso, você precisa criar uma variável.
fonte
Você pode fazer com que seu código fique melhor assim:
fonte
Depende. Quantos números você está adicionando? Testando muitas das sugestões acima:
Descobri que, usando uma máquina Ubuntu18 de 8 núcleos e 16 G, o loop era mais rápido para valores menores e o paralelo para maiores. Mas é claro que isso dependeria do hardware que você está executando:
fonte
Existe um método sum () na biblioteca underscore-java .
Exemplo de código:
fonte
Use abaixo da lógica:
fonte
Não existe um "método em uma aula de matemática" para isso. Não é como uma função de raiz quadrada ou algo parecido.
Você só precisa ter uma variável para a soma e fazer um loop pela matriz, adicionando cada valor encontrado à soma.
fonte
fonte
Podemos usar a função definida pelo usuário. Inicialmente, inicialize a variável soma igual a zero. Em seguida, percorra a matriz e adicione o elemento com soma. Atualize a variável sum.
Fragmento de código :
fonte
fonte
Um pouco surpreso ao ver Nenhuma das respostas acima considera que pode ser várias vezes mais rápido usando um pool de threads. Aqui,
parallel
usa um conjunto de encadeamentos de junção de bifurcação e interrompe automaticamente o fluxo em várias partes e as executa paralelamente e depois mescladas. Se você se lembrar da seguinte linha de código, poderá usá-la em vários lugares.Digamos que você queira fazer
sum of squares
, e Arrays.stream (nums) .parallel (). Map (x-> x * x) .reduce (0, (a, b) -> a + b). A idéia é que você ainda pode executar reduzir, sem mapa.fonte
fonte
fonte
A partir do Java 8, o uso de expressões lambda tornou-se disponível.
Veja isso:
Compactar:
Preferir:
Retornar ou imprimir soma.
fonte