জাভা: সংগ্রহের মাধ্যমে পুনরাবৃত্তি করার সর্বোত্তম উপায় (এখানে অ্যারেলিস্ট)


99

আজ আমি আনন্দের সাথে কোডিং করছিলাম যখন আমি কিছু টুকরো কোড পেয়েছি যা ইতিমধ্যে কয়েকশবার ব্যবহার করেছি:

একটি সংগ্রহের মাধ্যমে আইট্রেটিং (এখানে অ্যারেলিস্ট)

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

নিম্নলিখিত লুপগুলি অন্যগুলির তুলনায় আরও ভাল ব্যবহার করা উচিত?

ক্লাসিক অ্যারে সূচক লুপ:

for (int i = 0; i < collection.length; i++) {
  type array_element = collection.get(index);
}

আইট্রেটারটির নেক্সট () / পরবর্তী ():

for (Iterator iterator = collection.iterator(); iterator.hasNext();) {
  type type = (type) iterator.next();   
}

এবং আমার প্রিয় কারণ এটি লিখতে এত সহজ:

for (iterable_type iterable_element : collection) {

}

4
যখন এটি আমার কাছে আসে আমি বেশিরভাগ 3 য় লুপ ব্যবহার করি।
হ্যারি জয়

4
দ্বিতীয় for (Iterator<type> iterator = collection.iterator(); iterator.hasNext();) { type type = iterator.next(); }
উপায়টির

4
সংগ্রহ ইন্টারফেসে একটি পদ্ধতি "পেতে" থাকে না, তাই প্রথমটি সর্বদা সম্ভব হয় না।
দ্য পারসন

এছাড়াও প্রথম বিকল্পে, 'লুপের জন্য' এর জন্য, সংগ্রহের
দৈর্ঘ্যটি

উত্তর:


106

প্রথমটি কার্যকর যখন আপনার যখন উপাদানটির সূচকও প্রয়োজন তখন প্রয়োজন। এটি মূলত ArrayLists এর জন্য অন্য দুটি রূপের সমতুল্য , তবে আপনি যদি এটি ব্যবহার করেন তবে সত্যিই ধীর হবে LinkedList

দ্বিতীয়টি কার্যকর যখন আপনার যখন উপাদানটির সূচকের প্রয়োজন হয় না তবে আপনাকে পুনরাবৃত্তি করার সাথে সাথে উপাদানগুলি সরিয়ে ফেলতে হবে। তবে এতে সামান্য ভার্জোজ আইএমও হওয়ার অসুবিধা রয়েছে।

তৃতীয় সংস্করণটিও আমার পছন্দসই পছন্দ। এটি সংক্ষিপ্ত এবং সমস্ত ক্ষেত্রে কাজ করে যেখানে আপনার কোনও সূচক বা অন্তর্নিহিত পুনরাবৃত্তির প্রয়োজন নেই (যেমন আপনি কেবলমাত্র উপাদানগুলিতে অ্যাক্সেস করছেন, সেগুলি সরাচ্ছেন না বা Collectionকোনও উপায়ে পরিবর্তন করছেন না - যা সবচেয়ে সাধারণ ক্ষেত্রে)।


4
আমাকে এতে মারধর করুন লিঙ্কডলিস্ট উল্লেখ করতে যাচ্ছিল ( সমস্ত Collection সূচকের দ্বারা পুনরুদ্ধার করা সস্তা নয়)।
স্ক্রম মিস্টার

যতক্ষণ না কাউকে কেবলমাত্র উপাদানগুলিকে লুপ করার প্রয়োজন হয় ততক্ষণ 3 য় সংস্করণটি ব্যবহার করা ভাল, কারণ ইতিমধ্যে সমস্ত বিভিন্ন সংগ্রহ এবং সূর্যের জন্য বাস্তবায়ন ইতিমধ্যে বিদ্যমান এবং যে কোনও জেডিকে বাস্তবায়ন প্রতিটিটির চেয়ে কর্মক্ষমতা উন্নত করার চেষ্টা করে।
ফানি

@ ফানি: অন্য দুটি রূপগুলি জেডিকে যে কোনও বাস্তবায়নেও কাজ করে।
এমএকে

আমি বলিনি যে এগুলি কাজ করবে না, তবে যদি কোনও সুযোগে সংগ্রহগুলি বাস্তবায়নের জন্য নির্দিষ্ট কিছু উন্নতি বা পারফরম্যান্স পরিবর্তন করা হয় তবে তা স্বয়ংক্রিয়ভাবে আপনার কোডের জন্য প্রযোজ্য হবে এবং পারফরম্যান্স উন্নতির জন্য আপনাকে লেখার দরকার নেই আমি কি বলতে চাইছি
ফানি

4
@ ফানি: এএফএইখ 3 য় ফর্মটি কেবল ২ য় ফর্মের জন্য সিনট্যাকটিক চিনি (যেমন হুডের নীচে ফোর্যাচ বৈকল্পিক আসলে একটি পুনরুক্তি ব্যবহার করে)। সুতরাং কোনও পারফরম্যান্স সুবিধা উভয় ভেরিয়েন্টের জন্য উপলব্ধ হওয়া উচিত। প্রথম সংস্করণ অবশ্যই কোনও কার্যকারিতা সুবিধা পাবেন না (উদাহরণস্বরূপ যদি Listগাছ হিসাবে প্রয়োগ করা হয় তবে এটি আসলে ধীর হবে)।
, MAK

37

তাদের সকলের নিজস্ব ব্যবহার রয়েছে:

  1. আপনার যদি পুনরাবৃত্তিযোগ্য হয় এবং এগুলির সকলের সাথে শর্তহীনভাবে অতিক্রম করতে হবে:

    (পুনরাবৃত্তিযোগ্য টাইপ পুনরাবৃত্তি_ উপাদান: সংগ্রহ)

  2. আপনার যদি পুনরাবৃত্তিযোগ্য হয় তবে শর্তসাপেক্ষে অতিক্রম করতে হবে:

    (আইট্রেটর আয়রেটর = কালেকশন.িটরেটর (); পুনরুক্তিকারী .হাসনেক্সট ();)

  3. যদি ডেটা-কাঠামো পুনরাবৃত্তিযোগ্য প্রয়োগ করে না:

    (int i = 0; i <সংগ্রহ. দৈর্ঘ্য; i ++) এর জন্য


শর্তসাপেক্ষে প্রথম পদ্ধতিটি অতিক্রম করার জন্য আপনি এটি করতে পারেন: যদি (পুনরাবৃত্তিযোগ্য_সংশ্লিষ্ট s কিছু_সত্তর) {// কিছু করুন; } অন্য {// কিছুই করবেন না; । যদি হ্যাঁ তবে সিন্ট্যাকটিক চিনি ব্যতীত প্রথম এবং দ্বিতীয় পদ্ধতির মধ্যে মূলত কোনও পার্থক্য নেই।
টমাস এনগুইন

1 অন্য শর্ত অনুসারে শর্তসাপেক্ষে ট্র্যাভার্স করতে সক্ষম breakএবং / বাcontinue
arcyqwerty

13

জাভা 8 সহ অতিরিক্ত সংকলনের স্ট্রিম () ব্যবহার রয়েছে

collection.forEach((temp) -> {
            System.out.println(temp);
});

বা

collection.forEach(System.out::println);

জাভা 8 স্ট্রিম এবং উইনডেয়ার্স লিঙ্কের সংগ্রহ সম্পর্কে আরও তথ্য


4

এগুলির কেউই অন্যের চেয়ে "ভাল" নয়। তৃতীয়টি হ'ল, আমার কাছে আরও পাঠযোগ্য, তবে যে কেউ পূর্বাভাস ব্যবহার করে না তার পক্ষে এটি দেখতে অদ্ভুত লাগবে (তারা প্রথমটিকে পছন্দ করতে পারে)। 3 জন যা জাভা বুঝতে পারে তার কাছে সমস্ত 3 স্পষ্টভাবে পরিষ্কার, সুতরাং যে কোনও একটিই চয়ন করুন যা আপনাকে কোডটি সম্পর্কে আরও ভাল বোধ করে।

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


2

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

 for (int i=0, n=list.size(); i < n; i++)
     list.get(i);

এই লুপের চেয়ে দ্রুত চলে:

 for (Iterator i=list.iterator(); i.hasNext(); )
     i.next();

আমি আসা করি এটা সাহায্য করবে. ক্রমযুক্ত অ্যাক্সেস তালিকার জন্য প্রথম বিকল্পটি ধীর হবে।


1

এখানে একটি উদাহরণ

Query query = em.createQuery("from Student");
             java.util.List list = query.getResultList();
             for (int i = 0; i < list.size(); i++) 
             {

                 student = (Student) list.get(i);
                 System.out.println(student.id  + "  " + student.age + " " + student.name + " " + student.prenom);

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