क्या लूपिंग के बिना ArrayList के योग की संभावना है


88

क्या ArrayListबिना लूपिंग के योग की संभावना है ?

PHP प्रदान करता है sum(array)जो सरणी का योग देगा।

PHP कोड जैसा है

$a = array(2, 4, 6, 8);
echo "sum(a) = " . array_sum($a) . "\n";

मैं जावा में ऐसा ही करना चाहता था:

List tt = new ArrayList();
tt.add(1);
tt.add(2);
tt.add(3);

2
क्या होगा अगर ArrayListdoesn में कुछ ऐसा नहीं है जो "योग्‍य" है? ArrayList और एक सरणी जरूरी एक ही बात नहीं है। सरणी में संख्याओं के लिए, यह तत्वों पर लूप के लिए बहुत सरल है और एक संचयी राशि की गणना करता है।
11:02

PHP फ़ंक्शन array_sumआंतरिक रूप से एक लूप भी करता है, यह सिर्फ उपयोगकर्ता से छुपाता है।
पाओलो एबरमन

1
यह एक उचित सवाल है। सब के बाद, यह एक सूची में सबसे बड़ा तत्व खोजने के लिए एक लूप लिखने के लिए लगभग तुच्छ के रूप में है, फिर भी java.util.Collections एक अधिकतम () विधि प्रदान करता है।
जॉन वेलोनिस

1
बहुत ही वाजिब सवाल, आखिरकार, यह तरीकों की बात है, है ना? पुन: :)
बेन टालियाडोरस

लूप सुंदर हैं।
एलेक्स78191

जवाबों:


156

एक बार बाहर है (मार्च 2014) आप धाराओं का उपयोग करने में सक्षम होंगे :

अगर आपके पास एक है List<Integer>

int sum = list.stream().mapToInt(Integer::intValue).sum();

यदि यह ए int[]

int sum = IntStream.of(a).sum();

5
mapस्पष्ट रूप से छोरों का उपयोग करता है
निकोस एम।

8
आप लूप का उपयोग नहीं करने के लिए पुनरावृत्ति का उपयोग कर सकते हैं। : D (ऐसा न करें)
Caleb Fenton

23

फिर इसे स्वयं लिखें:

public int sum(List<Integer> list) {
     int sum = 0; 

     for (int i : list)
         sum = sum + i;

     return sum;
}

1
या ArrayList को राशि पद्धति से बढ़ाते हुए ताकि आप इसे अपने ArrayList के लिए बनाए।
बुएलर

3
वास्तविक जोड़ करते समय, यह एक सरल का उपयोग करने के लिए अच्छा है int। यहां Integerजावा के ऑटो-बॉक्सिंग सुविधाओं के साथ उपयोग करने में बहुत कम मूल्य है। इसके अलावा, आप Integerहर बार संभावित रूप से कई नई वस्तुओं का निर्माण और पुन: निर्माण कर रहे हैं , क्योंकि यह एक Immutableप्रकार है।
जावा ड्रिंकर

10

लूप का उपयोग करने का एकमात्र विकल्प पुनरावृत्ति का उपयोग करना है।

आप की तरह एक विधि को परिभाषित कर सकते हैं

public static int sum(List<Integer> ints) {
   return ints.isEmpty() ? 0 : ints.get(0) + ints.subList(1, ints.length());
}

यह एक सादे लूप का उपयोग करने की तुलना में बहुत अक्षम है और सूची में कई तत्व होने पर आपको उड़ा सकता है।

एक विकल्प जो स्टैक ओवरफ्लो से बचने के लिए उपयोग करना है।

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));
}

यह सिर्फ अक्षम के रूप में है, लेकिन एक स्टैक अतिप्रवाह से बचना होगा।


एक ही बात लिखने का सबसे छोटा तरीका है

int sum = 0, a[] = {2, 4, 6, 8};

for(int i: a) {
    sum += i;
}

System.out.println("sum(a) = " + sum);

प्रिंट

sum(a) = 20

कोड में आपको पहली पुनरावर्ती परिभाषा में योग () की याद आती है। दूसरी पुनरावर्ती परिभाषा स्टैक ओवरफ्लो को होने से नहीं रोकती है, इससे इसकी संभावना कम हो जाती है।
त्यूदिमुंडो

1
@Teudimundo सच है, जबकि यह इसे नहीं रोकता है, एक सूची का अधिकतम आकार Integer.MAX_VALUE है और लॉग 2 31 है जो अधिकतम गहराई है। अधिकांश प्रणालियों में एक सीमा के रूप में कई हजारों कॉल होते हैं लेकिन अगर आप इसके बहुत करीब हैं तो यह अभी भी उड़ सकता है।
पीटर लॉरी

9

एक उपयोग फ़ंक्शन लिखें

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;
    }
}

फिर जैसे का उपयोग करें

int sum = ListUtil.sum(yourArrayList)

लेकिन मैं इसे कैसे सरणी में लंबे समय के लिए कर सकता हूं?
रवि परमार

5

मेरे लिए सबसे स्पष्ट तरीका यह है:

doubleList.stream().reduce((a,b)->a+b).get();

या

doubleList.parallelStream().reduce((a,b)->a+b).get();

यह आंतरिक छोरों का भी उपयोग करता है, लेकिन यह छोरों के बिना संभव नहीं है।


2

आप अपाचे कॉमन्स-संग्रह एपीआई का उपयोग कर सकते हैं।

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;
        }
    }

फिर नीचे दिखाए अनुसार इस क्लोजर का उपयोग करें:

public int aggregate(List<Integer> aList) {
        AggregateClosure closure = new AggregateClosure();
        org.apache.commons.collections.CollectionUtils.forAllDo(aList, closure);
        return closure.getTotal();
}

1

यदि आप मानचित्र फ़ंक्शन के बारे में जानते हैं, तो आप जानते हैं कि एक नक्शा भी पुनरावर्ती लूप या पुनरावर्ती लूप हो सकता है। लेकिन जाहिर है कि आपको इसके लिए प्रत्येक तत्व तक पहुंचना होगा। इसलिए, मैं जावा 8 को काम नहीं कर सका, क्योंकि कुछ सिंटैक्स बेमेल था, लेकिन बहुत कम चाहता था इसलिए मुझे यही मिला।

int sum = 0
for (Integer e : myList) sum += e;

तुम सही हो। मैंने कहा कि यह नक्शे के बजाय एक न्यूनतम लूप है जो पूंछ पुनरावर्ती हो सकता है।
सिवी

"बिना लुगदी के एरेलेलिस्ट की राशि की संभावना है"
एलेक्जेंडर

0

यह देखते हुए कि एक सूची किसी भी प्रकार की वस्तु धारण कर सकती है, कोई ऐसी विधि निर्मित नहीं होती है जिससे आप सभी तत्वों को योग कर सकें। आप ऐसा कुछ कर सकते हैं:

int sum = 0;

for( Integer i : ( ArrayList<Integer> )tt ) {
  sum += i;
}

वैकल्पिक रूप से आप अपना खुद का कंटेनर प्रकार बना सकते हैं जो कि ArrayList से विरासत में मिला है, लेकिन सम नामक एक विधि भी लागू करता है (जो ऊपर दिए गए कोड को लागू करता है।


0

ArrayList तत्वों का एक संग्रह है (सूची के रूप में), आदिम को रैपर क्लास ऑब्जेक्ट के रूप में संग्रहीत किया जाता है, लेकिन साथ ही मैं स्ट्रिंग क्लास की वस्तुओं को भी स्टोर कर सकता हूं। एसयूएम का इससे कोई मतलब नहीं होगा। BTW लूप के लिए उपयोग करने से क्यों डरते हैं (बढ़ाया या पुनरावृत्त) वैसे भी?


0

या ग्रूवी पर स्विच करें, इसमें एक संग्रह पर एक योग () फ़ंक्शन है। [1,2,3,4,5,6] .sum ()

http://groovy.codehaus.org/JN1015-Collections

अपने जावा कक्षाओं के रूप में उसी JVM पर चलता है।


8
हाँ। सम फ़ंक्शन निश्चित रूप से किसी अन्य भाषा में स्विच करने का कारण है। : D
ruX

1
प्रश्न को टैग किया गया है Java, इसलिए यह तकनीकी रूप से मान्य उत्तर नहीं है।
Bengt

0

यह लिंक जावा में योग करने के तीन अलग-अलग तरीकों को दिखाता है, एक विकल्प है जो अपाचे कॉमन्स मठ का उपयोग करके पिछले उत्तरों में नहीं है।

उदाहरण:

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));

}

देखें StatUtils एपीआई


0

आप GNU ट्रोव लाइब्रेरी का उपयोग कर सकते हैं :

TIntList tt = new TIntArrayList();
tt.add(1);
tt.add(2);
tt.add(3);
int sum = tt.sum();

0

यह विधि संदर्भों के उपयोग को कम करने के साथ किया जा सकता है reduce(Integer::sum):

Integer reduceSum = Arrays.asList(1, 3, 4, 6, 4)
        .stream()
        .reduce(Integer::sum)
        .get();

या बिना Optional:

Integer reduceSum = Arrays.asList(1, 3, 4, 6, 4)
        .stream()
        .reduce(0, Integer::sum);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.