লুপিং ছাড়াই অ্যারেলিস্টের যোগফলের সম্ভাবনা আছে কি?


88

ArrayListলুপ না করে যোগফলের কি সম্ভাবনা আছে ?

পিএইচপি সরবরাহ করে sum(array)যা অ্যারের যোগফল দেয়।

পিএইচপি কোড মত

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

4
কী যদি ArrayList"সংক্ষেপণযোগ্য" এমন কিছু না থাকে? অ্যারেলিস্ট এবং একটি অ্যারে অগত্যা একই জিনিস নয়। একটি অ্যারের সংখ্যার যোগফল হিসাবে, এটি উপাদানগুলির উপর লুপ এবং একটি যোগফলের যোগফল গণনা করার জন্য খুব সহজ।
পোস্টেফ

পিএইচপি ফাংশন array_sumঅভ্যন্তরীণভাবে একটি লুপ করে, এটি এটি ব্যবহারকারীর কাছ থেকে লুকিয়ে রাখে।
পাওলো ইবারম্যান

4
এটি একটি যুক্তিসঙ্গত প্রশ্ন। সর্বোপরি, তালিকার বৃহত্তম উপাদান খুঁজে পেতে এটি একটি লুপ লিখতে প্রায় তুচ্ছ, তবুও java.util. সংগ্রহগুলি একটি সর্বাধিক () পদ্ধতি সরবরাহ করে।
জন ভেলোনিস

4
খুব যুক্তিসঙ্গত প্রশ্ন, সর্বোপরি, এটি পদ্ধতির মূল বিষয়, তাই না? পুনঃব্যবহার :)
বেন টালিডিয়োরোস

লুপগুলি সুন্দর।
Alex78191

উত্তর:


156

একদা আউট (মার্চ 2014) আপনি স্ট্রিম ব্যবহার করতে সক্ষম হবেন :

যদি তোমার কাছে থাকে একটা List<Integer>

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

যদি এটি একটি int[]

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

4
mapলুপগুলি স্পষ্টভাবে ব্যবহার করে
নিকস এম।

8
আপনি লুপ ব্যবহার না করার জন্য পুনরাবৃত্তি ব্যবহার করতে পারেন। : ডি (এটি করবেন না)
কালেব ফেন্টন

23

তারপরে নিজে লিখুন:

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

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

     return sum;
}

4
বা যোগফল পদ্ধতির সাথে অ্যারেলিস্ট প্রসারিত করা যাতে আপনি এটি আপনার নিজের অ্যারেলিস্টে অন্তর্নির্মিত হন।
বুয়েলার

4
প্রকৃত সংযোজনটি করার সময়, একটি সহজ ব্যবহার করা কেবল ভাল intIntegerজাভা-র অটো-বক্সিং বৈশিষ্ট্যগুলি এখানে ব্যবহারের খুব কম মূল্য নেই। এছাড়াও, আপনি Integerপ্রতিবার সম্ভাব্য অনেকগুলি নতুন বস্তু তৈরি এবং পুনরায় তৈরি করছেন , কারণ এটি একটি Immutableপ্রকার an
জাভা ড্রিঙ্কার

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

এটি ঠিক ততটাই অদক্ষ, তবে স্ট্যাকের ওভারফ্লো এড়াতে পারবে।


একই জিনিস লেখার সবচেয়ে সংক্ষিপ্ততম উপায় way

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

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

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

প্রিন্ট

sum(a) = 20

কোডটিতে আপনি প্রথম পুনরাবৃত্ত সংজ্ঞাতে যোগফলকে () মিস করেছেন। দ্বিতীয় পুনরাবৃত্ত সংজ্ঞা স্ট্যাকের ওভারফ্লোটি ঘটতে বাধা দেয় না, এটি এটির সম্ভাবনা কম করে।
তেউডিমুন্ডো

4
@ তিউডিমুন্ডো সত্য, যদিও এটি এটি প্রতিরোধ করে না, তবে একটি তালিকার সর্বাধিক আকার হ'ল পূর্ণসংখ্যা MA MAX_VALUE এবং লগ 2 31 যা সর্বোচ্চ গভীরতা। বেশিরভাগ সিস্টেমে সীমা হিসাবে অনেক হাজার কল রয়েছে তবে আপনি যদি এর খুব কাছাকাছি থাকেন তবে এটি এখনও ফুঁকতে পারে।
পিটার লরে 14

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

আপনি অ্যাপাচি কমন্স-সংগ্রহ API ব্যবহার করতে পারেন।

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;

তুমি ঠিক. আমি বলেছিলাম এটি মানচিত্রের পরিবর্তে একটি সর্বনিম্ন লুপ যা পুচ্ছ পুনরাবৃত্তি হতে পারে।
sivi

"লুপ ছাড়াই অ্যারেলিস্টের যোগফলের সম্ভাবনা আছে"
আলেকজান্দার

0

একটি তালিকা যে কোনও ধরণের অবজেক্টকে ধরে রাখতে পারে তা প্রদত্ত, এমন কোনও পদ্ধতি অন্তর্নির্মিত নয় যা আপনাকে সমস্ত উপাদানকে যোগ করতে দেয়। আপনি এরকম কিছু করতে পারেন:

int sum = 0;

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

বিকল্পভাবে আপনি আপনার নিজের ধারক প্রকার তৈরি করতে পারেন যা অ্যারেলিস্ট থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়েছে তবে উপরের কোডটি কার্যকর করে যোগফল () নামে একটি পদ্ধতি প্রয়োগ করে।


0

অ্যারেলিস্ট উপাদানগুলির সংগ্রহ (তালিকার আকারে), আদিমটি মোড়ক শ্রেণির অবজেক্ট হিসাবে সংরক্ষণ করা হয় তবে একই সাথে আমি স্ট্রিং শ্রেণির অবজেক্টগুলিকেও সংরক্ষণ করতে পারি। এসইউএম এটিতে কোনও অর্থ দেবে না। বিটিডাব্লু কেন লুপ (বর্ধিত বা পুনরুদ্ধারের মাধ্যমে) ব্যবহার করতে এত ভয় পাচ্ছে?


0

বা গ্রোভিতে স্যুইচ করুন, এটি একটি সংকলনের একটি যোগফল () রয়েছে। [1,2,3,4,5,6] .সুম ()

http://groovy.codehaus.org/JN1015- সংগ্রহ

আপনার জাভা ক্লাসগুলির মতো একই জেভিএমে চলে।


8
হ্যাঁ যোগফল অবশ্যই অন্য ভাষায় স্যুইচ করার কারণ। : ডি
রুএক্স

4
প্রশ্নটি ট্যাগ করা হয়েছে Java, সুতরাং এটি প্রযুক্তিগতভাবে কোনও বৈধ উত্তর নয়।
বেঙ্গল

0

এই লিঙ্কটি জাভাতে কীভাবে যোগ করতে হয় তার তিনটি ভিন্ন উপায় দেখায়, একটি বিকল্প রয়েছে যা অ্যাপাচি কমন্স ম্যাথ ব্যবহার করে পূর্ববর্তী উত্তরে নয় answers

উদাহরণ:

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

}

দেখা স্ট্যাটুটিলস এপিআই



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);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.