2015-05-22 13 views
5

dizininde listelenmektedir. Tüm ağaç listelerini toplamanın daha etkili bir yolu olup olmadığını bilmek istiyorum - değerlerini aynı dizinde toplamak.Java Akımları API toplamları

Bunun nedeni, nedenini kullanmamın nedeni, muhtemelen Streams API'sini kullanarak, herhangi bir sayıda liste için daha genel olmasını sağlamaktır.

Herhangi bir içgörü için teşekkürler.

+0

Başka ne için kullanmak istiyorum - 'Number's bütün? – ChiefTwoPencils

+0

@ChiefTwoPencils Evet haklısın sadece orada bariz olanı özledim, onu düzenledim, soru hala listelerin herhangi bir sayısı için geçerli, teşekkürler – dotmindlabs

+0

@sodik i listeleri, herhangi bir sayı için demek, eğer 100 listeleri söyleyeyim Bir aralıktan indeksler ve değerlerini 100 kez aldıkça aşırıya kaçıyor. – dotmindlabs

cevap

5

nasıl bu konuda:

List<List<Double>> lists = ...; 

// ensure all lists are same size, and get size 
int[] sizes = lists.stream().mapToInt(List::size).distinct().toArray(); 
if (sizes.length != 1) 
    throw ... 
int size = sizes[0]; 

double[] sums = 
    IntStream.range(0, size) 
      .mapToDouble(i -> lists.stream().mapToDouble(list -> list.get(i)).sum()) 
      .toArray(); 
+0

küçük yazım hatası, 'lists.stream() olmalıdır. MapToInt (...) ', :-) Ayrıca bu .distinct(). Limit (2)' ile daha fazla performans yapamazsınız. 2 farklı boyuttan daha fazlasını bulduğunuzda, hesaplamaları durdurursunuz? – user2336315

+0

Çok iyi, basit ve temiz, mantıklı, teşekkürler! – dotmindlabs

+2

@ user2336315 Sabit yazım hatası. "Sınır" öneriniz tamam, ama açıkçası rahatsız olmaz; Ekstra "maliyet" sadece bir istisna atmaya başlamadan hemen önce ortaya çıkar. Will-fail yolları üzerinde küçük optimizasyonlar nadiren ek karmaşıklığa değer. –