Apakah ada kemungkinan jumlah ArrayList
tanpa perulangan?
PHP menyediakan sum(array)
yang akan memberikan jumlah array.
Seperti kode PHP
$a = array(2, 4, 6, 8);
echo "sum(a) = " . array_sum($a) . "\n";
Saya ingin melakukan hal yang sama di Java:
List tt = new ArrayList();
tt.add(1);
tt.add(2);
tt.add(3);
ArrayList
tidak berisi sesuatu yang "dapat diringkas"? ArrayList dan array belum tentu sama. Adapun menjumlahkan angka dalam larik, itu adalah perulangan for yang sangat sederhana atas elemen dan menghitung jumlah kumulatif.array_sum
juga melakukan loop secara internal, itu hanya menyembunyikannya dari pengguna.Jawaban:
Sekali java-8sudah keluar (Maret 2014), Anda akan dapat menggunakan streaming :
Jika Anda memiliki file
List<Integer>
int sum = list.stream().mapToInt(Integer::intValue).sum();
Jika itu
int[]
int sum = IntStream.of(a).sum();
sumber
map
menggunakan loop secara implisitKemudian tulis sendiri:
public int sum(List<Integer> list) { int sum = 0; for (int i : list) sum = sum + i; return sum; }
sumber
int
. Ada sedikit manfaat dalam menggunakan fiturInteger
java-boxing otomatis di sini. Selain itu, Anda membuat dan membuat ulang banyakInteger
objek baru yang berpotensi setiap kali, karena ini adalahImmutable
tipe.Satu-satunya alternatif untuk menggunakan loop adalah dengan menggunakan rekursi.
Anda dapat menentukan metode seperti
public static int sum(List<Integer> ints) { return ints.isEmpty() ? 0 : ints.get(0) + ints.subList(1, ints.length()); }
Ini sangat tidak efisien dibandingkan dengan menggunakan loop biasa dan dapat meledak jika Anda memiliki banyak elemen dalam daftar.
Alternatif yang menghindari tumpukan overflow adalah dengan menggunakan.
public static int sum(List<Integer> ints) { int len = ints.size(); if (len == 0) return 0; if (len == 1) return ints.get(0); return sum(ints.subList(0, len/2)) + sum(ints.subList(len/2, len)); }
Ini sama tidak efisiennya, tetapi akan menghindari tumpukan melimpah.
Cara terpendek untuk menulis hal yang sama adalah
int sum = 0, a[] = {2, 4, 6, 8}; for(int i: a) { sum += i; } System.out.println("sum(a) = " + sum);
cetakan
sum(a) = 20
sumber
Tulis fungsi util seperti
public class ListUtil{ public static int sum(List<Integer> list){ if(list==null || list.size()<1) return 0; int sum = 0; for(Integer i: list) sum = sum+i; return sum; } }
Kemudian gunakan seperti
int sum = ListUtil.sum(yourArrayList)
sumber
bagi saya cara paling jelas adalah ini:
atau
Ini juga menggunakan loop internal, tetapi tidak mungkin tanpa loop.
sumber
Anda dapat menggunakan API apache commons-collections.
class AggregateClosure implements org.apache.commons.collections.Closure { int total = 0; @Override public void execute(Object input) { if (input != null) { total += (Integer) input; } } public int getTotal() { return total; } }
Kemudian gunakan penutupan ini seperti yang ditunjukkan di bawah ini:
public int aggregate(List<Integer> aList) { AggregateClosure closure = new AggregateClosure(); org.apache.commons.collections.CollectionUtils.forAllDo(aList, closure); return closure.getTotal(); }
sumber
Jika Anda mengetahui tentang fungsi peta, maka Anda tahu bahwa peta juga dapat berupa loop rekursif atau loop rekursif. Tapi jelas Anda harus mencapai setiap elemen untuk itu. jadi, saya tidak bisa mengerjakan Java 8, karena beberapa sintaks tidak cocok tetapi ingin sangat singkat jadi inilah yang saya dapatkan.
int sum = 0 for (Integer e : myList) sum += e;
sumber
Mengingat bahwa daftar dapat menampung semua jenis objek, tidak ada metode bawaan yang memungkinkan Anda menjumlahkan semua elemen. Anda bisa melakukan sesuatu seperti ini:
int sum = 0; for( Integer i : ( ArrayList<Integer> )tt ) { sum += i; }
Alternatifnya, Anda bisa membuat jenis penampung Anda sendiri yang mewarisi dari ArrayList tetapi juga mengimplementasikan metode yang disebut sum () yang mengimplementasikan kode di atas.
sumber
ArrayList adalah Kumpulan elemen (dalam bentuk list), primitif disimpan sebagai objek kelas pembungkus tetapi pada saat yang sama saya dapat menyimpan objek kelas String juga. SUM tidak masuk akal dalam hal itu. BTW mengapa begitu takut menggunakan for loop (ditingkatkan atau melalui iterator) lagian?
sumber
Atau beralih ke Groovy, ini memiliki fungsi sum () pada koleksi. [1,2,3,4,5,6] .sum ()
http://groovy.codehaus.org/JN1015-Collections
Berjalan di JVM yang sama dengan kelas java Anda.
sumber
Java
, jadi ini secara teknis bukan jawaban yang valid.Tautan ini menunjukkan tiga cara berbeda bagaimana menjumlahkan di java, ada satu opsi yang tidak ada di jawaban sebelumnya menggunakan Apache Commons Math ..
Contoh:
public static void main(String args []){ List<Double> NUMBERS_FOR_SUM = new ArrayList<Double>(){ { add(5D); add(3.2D); add(7D); } }; double[] arrayToSume = ArrayUtils.toPrimitive(NUMBERS_FOR_SUM .toArray(new Double[NUMBERS_FOR_SUM.size()])); System.out.println(StatUtils.sum(arrayToSume)); }
Lihat api StatUtils
sumber
Anda dapat menggunakan perpustakaan Trove GNU :
TIntList tt = new TIntArrayList(); tt.add(1); tt.add(2); tt.add(3); int sum = tt.sum();
sumber
Ini dapat dilakukan dengan mengurangi menggunakan referensi metode
reduce(Integer::sum)
:Integer reduceSum = Arrays.asList(1, 3, 4, 6, 4) .stream() .reduce(Integer::sum) .get();
Atau tanpa
Optional
:Integer reduceSum = Arrays.asList(1, 3, 4, 6, 4) .stream() .reduce(0, Integer::sum);
sumber