Bagaimana Anda menemukan jumlah semua angka dalam array di Jawa?
141
Saya mengalami masalah menemukan jumlah semua bilangan bulat dalam sebuah array di Jawa. Saya tidak dapat menemukan metode yang berguna di Mathkelas untuk ini.
Tulis sendiri, kode untuk melakukannya adalah 2-3 baris.
wkl
2
Sayangnya "jawaban" di atas (dan berikut) adalah "The Java Way": - / Anda bisa menggunakan perpustakaan Java Fungsional , tetapi sangat merepotkan untuk berurusan dengan sintaks Java.
1
Saya tahu pertanyaan ini sudah sangat lama, tetapi jawaban oleh msayag di bawah ini sepertinya harus ditandai sebagai jawaban yang diterima.
Matsu Q.
Masalah dengan tulisan yang Anda miliki adalah bahwa itu adalah sebuah loop. Ketika Anda mengambil jumlah dari 3 angka Anda harus dapat melakukannya dalam satu instruksi.
Bagaimana jika array berisi angka besar dan jumlahnya di luar lingkup int?
thanhbinh84
5
Dalam hal ini Anda dapat menggunakan LongStream, baik sebagai jumlah panjang = IntStream.of (a) .asLongStream (). Sum (); atau jumlah panjang = LongStream.of (a) .sum ();
msayag
2
Apakah ada keuntungan kecepatan yang cukup besar dalam menggunakan stream?
mvorisek
1
Jika jumlah Anda tidak akan cocok untuk waktu yang lama, Anda harus menjumlahkan pasangan dengan bijaksana (bagi dan taklukkan), karena menjumlahkan BigDecimal yang lebih kecil lebih cepat.
Jika Anda menggunakan Java 8, Arrayskelas menyediakan stream(int[] array)metode yang mengembalikan berurutan IntStreamdengan intarray yang ditentukan . Itu juga telah kelebihan beban untuk doubledan longarray.
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
Akhirnya, dapat mengambil array tipe T. Jadi Anda dapat, misalnya, memiliki Stringyang berisi angka sebagai input dan jika Anda ingin menjumlahkannya cukup lakukan:
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);}}
Satu-satunya poin yang saya tambahkan ke solusi sebelumnya adalah bahwa saya akan menggunakan waktu yang lama untuk mengakumulasi total untuk menghindari kelebihan nilai.
int[] someArray ={1,2,3,4,5,6,7,8,9,10,Integer.MAX_VALUE};long sum =0;for(int i : someArray)
sum += i;
Anda dapat membuatnya lebih bagus dengan setiap loop (diperkenalkan di Java 1.5).
wkl
6
Di Java 8
Kode :
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());
Output :
The summation of array is 15Another way to find summation :15
Penjelasan :
Di Java 8, Anda dapat menggunakan konsep reduksi untuk melakukan penambahan.
IMHO fungsi penjumlahan akan tampak cocok untuk memperluas kelas Array tempat mengisi, mengurutkan, mencari, menyalin, & sama dengan hidup. Ada banyak metode praktis yang bersembunyi di javadocs sehingga merupakan pertanyaan yang wajar ketika mengirim Fortran ke java untuk ditanyakan sebelum meluncurkan metode pembantu kami sendiri. Cari melalui indeks javadoc besar untuk "jumlah", "tambahkan" dan kata kunci lain yang mungkin Anda pikirkan. Anda mungkin curiga seseorang telah melakukan ini untuk tipe primitif int, float, double, Integer, Float, Double? Tidak peduli sesederhana apa pun, selalu baik untuk memeriksa. Simpan kode sesederhana mungkin dan jangan menemukan kembali kemudi.
Anda harus memutar sendiri.
Anda mulai dengan total 0. Kemudian Anda mempertimbangkan untuk setiap integer dalam array, tambahkan total. Kemudian ketika Anda kehabisan bilangan bulat, Anda memiliki jumlah.
Jika tidak ada bilangan bulat, maka totalnya adalah 0.
Ada dua hal yang dapat dipelajari dari latihan ini:
Anda perlu melakukan iterasi melalui elemen-elemen array dengan cara lain - Anda dapat melakukan ini dengan for for atau loop sementara. Anda perlu menyimpan hasil penjumlahan dalam akumulator. Untuk ini, Anda perlu membuat variabel.
int accumulator =0;for(int i =0; i < myArray.length; i++){
accumulator += myArray[i];}
Anda dapat membuat kode Anda terlihat lebih baik seperti ini:
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;}
Tergantung. Berapa angka yang Anda tambahkan? Menguji banyak saran di atas:
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);}}
Saya menemukan, menggunakan mesin 8 inti, 16 G Ubuntu18, loop itu tercepat untuk nilai yang lebih kecil dan paralel untuk yang lebih besar. Tetapi tentu saja itu tergantung pada perangkat keras yang Anda jalankan:
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;}
Tidak ada 'metode di kelas matematika' untuk hal seperti itu. Ini tidak seperti fungsi akar kuadrat atau sesuatu seperti itu.
Anda hanya perlu memiliki variabel untuk penjumlahan dan perulangan melalui array yang menambahkan setiap nilai yang Anda temukan ke penjumlahan tersebut.
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 }}
Kami dapat menggunakan fungsi yang ditentukan pengguna. Pada awalnya, inisialisasi jumlah variabel sama dengan nol. Kemudian lintasi array dan tambahkan elemen dengan jumlah. Kemudian perbarui variabel jumlah.
Cuplikan Kode:
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);}}
Agak kaget melihat Tak satu pun dari jawaban di atas menganggapnya bisa beberapa kali lebih cepat menggunakan kumpulan utas. Di sini, parallelgunakan fork-join thread pool dan secara otomatis memecah aliran di beberapa bagian dan menjalankannya paralel dan kemudian bergabung. Jika Anda hanya mengingat baris kode berikut, Anda dapat menggunakannya di banyak tempat.
Jadi penghargaan untuk kode pendek dan manis tercepat diberikan kepada -
int[] nums ={1,2,3};int sum =Arrays.stream(nums).parallel().reduce(0,(a,b)-> a+b);
Katakanlah Anda ingin melakukan sum of squares, lalu Arrays.stream (nums) .parallel (). Map (x-> x * x) .reduce (0, (a, b) -> a + b). Ide adalah Anda masih dapat melakukan pengurangan, tanpa peta.
Belum tentu tercepat. Loop akan mengungguli N. kecil. Lihat posting saya lagi dengan detail.
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);}}
Pada Java 8 Penggunaan ekspresi lambda telah tersedia.
Lihat ini:
int[] nums =/** Your Array **/;
Kompak:
int sum =0;Arrays.asList(nums).stream().forEach(each ->{
sum += each;});
Lebih suka:
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;});
Jawaban:
Di java-8 Anda dapat menggunakan stream:
Keluaran:
Jumlahnya 150.
Ada dalam paket
java.util.stream
sumber
java.util.stream.DoubleStream.of(a).sum();
Jika Anda menggunakan Java 8,
Arrays
kelas menyediakanstream(int[] array)
metode yang mengembalikan berurutanIntStream
denganint
array yang ditentukan . Itu juga telah kelebihan beban untukdouble
danlong
array.Ini juga menyediakan metode
stream(int[] array, int startInclusive, int endExclusive)
yang memungkinkan Anda untuk mengambil rentang array tertentu (yang dapat berguna):Akhirnya, dapat mengambil array tipe
T
. Jadi Anda dapat, misalnya, memilikiString
yang berisi angka sebagai input dan jika Anda ingin menjumlahkannya cukup lakukan:sumber
Ini adalah salah satu hal sederhana yang tidak ada (AFAIK) di API Java standar. Cukup mudah untuk menulis sendiri.
Jawaban lain baik-baik saja, tetapi ada satu dengan beberapa untuk masing-masing gula sintaksis.
Juga, contoh dari penjumlahan array bahkan ditunjukkan dalam Spesifikasi Bahasa Java 7 . Contohnya adalah dari Bagian 10.4 - Akses Array .
sumber
Kamu tidak bisa Bahasa lain memiliki beberapa metode untuk ini seperti array_sum () di PHP, tetapi Java tidak.
Hanya..
sumber
Dalam Apache Math: Ada
StatUtils.sum(double[] arr)
sumber
Satu-satunya poin yang saya tambahkan ke solusi sebelumnya adalah bahwa saya akan menggunakan waktu yang lama untuk mengakumulasi total untuk menghindari kelebihan nilai.
sumber
sumber
Di
Java 8
Kode :
Output :
Penjelasan :
Di
Java 8
, Anda dapat menggunakan konsep reduksi untuk melakukan penambahan.Baca semua tentang Pengurangan
sumber
sumber
IMHO fungsi penjumlahan akan tampak cocok untuk memperluas kelas Array tempat mengisi, mengurutkan, mencari, menyalin, & sama dengan hidup. Ada banyak metode praktis yang bersembunyi di javadocs sehingga merupakan pertanyaan yang wajar ketika mengirim Fortran ke java untuk ditanyakan sebelum meluncurkan metode pembantu kami sendiri. Cari melalui indeks javadoc besar untuk "jumlah", "tambahkan" dan kata kunci lain yang mungkin Anda pikirkan. Anda mungkin curiga seseorang telah melakukan ini untuk tipe primitif int, float, double, Integer, Float, Double? Tidak peduli sesederhana apa pun, selalu baik untuk memeriksa. Simpan kode sesederhana mungkin dan jangan menemukan kembali kemudi.
sumber
Saya suka metode ini secara pribadi. Gaya kode saya sedikit aneh.
Cukup mudah digunakan dalam kode:
sumber
Saya menggunakan ini:
sumber
Anda harus memutar sendiri.
Anda mulai dengan total 0. Kemudian Anda mempertimbangkan untuk setiap integer dalam array, tambahkan total. Kemudian ketika Anda kehabisan bilangan bulat, Anda memiliki jumlah.
Jika tidak ada bilangan bulat, maka totalnya adalah 0.
sumber
Ada dua hal yang dapat dipelajari dari latihan ini:
Anda perlu melakukan iterasi melalui elemen-elemen array dengan cara lain - Anda dapat melakukan ini dengan for for atau loop sementara. Anda perlu menyimpan hasil penjumlahan dalam akumulator. Untuk ini, Anda perlu membuat variabel.
sumber
Anda dapat membuat kode Anda terlihat lebih baik seperti ini:
sumber
Tergantung. Berapa angka yang Anda tambahkan? Menguji banyak saran di atas:
Saya menemukan, menggunakan mesin 8 inti, 16 G Ubuntu18, loop itu tercepat untuk nilai yang lebih kecil dan paralel untuk yang lebih besar. Tetapi tentu saja itu tergantung pada perangkat keras yang Anda jalankan:
sumber
Ada metode jumlah () di perpustakaan underscore-java .
Contoh kode:
sumber
Gunakan logika di bawah ini:
sumber
Tidak ada 'metode di kelas matematika' untuk hal seperti itu. Ini tidak seperti fungsi akar kuadrat atau sesuatu seperti itu.
Anda hanya perlu memiliki variabel untuk penjumlahan dan perulangan melalui array yang menambahkan setiap nilai yang Anda temukan ke penjumlahan tersebut.
sumber
sumber
Kami dapat menggunakan fungsi yang ditentukan pengguna. Pada awalnya, inisialisasi jumlah variabel sama dengan nol. Kemudian lintasi array dan tambahkan elemen dengan jumlah. Kemudian perbarui variabel jumlah.
Cuplikan Kode:
sumber
sumber
Agak kaget melihat Tak satu pun dari jawaban di atas menganggapnya bisa beberapa kali lebih cepat menggunakan kumpulan utas. Di sini,
parallel
gunakan fork-join thread pool dan secara otomatis memecah aliran di beberapa bagian dan menjalankannya paralel dan kemudian bergabung. Jika Anda hanya mengingat baris kode berikut, Anda dapat menggunakannya di banyak tempat.Katakanlah Anda ingin melakukan
sum of squares
, lalu Arrays.stream (nums) .parallel (). Map (x-> x * x) .reduce (0, (a, b) -> a + b). Ide adalah Anda masih dapat melakukan pengurangan, tanpa peta.sumber
sumber
sumber
Pada Java 8 Penggunaan ekspresi lambda telah tersedia.
Lihat ini:
Kompak:
Lebih suka:
Kembalikan atau cetak jumlah.
sumber