জাভা গণনা এবং আইট্রেটারের মধ্যে পার্থক্য


120

এই দুটি ইন্টারফেসের মধ্যে সঠিক পার্থক্য কি? Enumerationব্যবহার করে কি সুবিধা আছে Iterator? যদি কেউ বিশদভাবে বলতে পারে তবে একটি রেফারেন্স নিবন্ধ প্রশংসিত হবে।


3
আমি একটি গুগল অনুসন্ধান ব্যবহার করেছি এবং প্রথম ফলটি ছিল জাভাআরঞ্চে এনুমুরেশন বনাম
বিজয়ী

উত্তর:


142

Iteratorইন্টারফেসের জন্য জাভা এপিআই স্পেসিফিকেশনটির দিকে তাকালে , এর মধ্যে পার্থক্যের একটি ব্যাখ্যা রয়েছে Enumeration:

পরীক্ষকগণ দুটি উপায়ে গণনা থেকে পৃথক:

  • আইট্রেটাররা পুনরাবৃত্তির সময় ভাল-সংজ্ঞায়িত শব্দার্থক শব্দগুলির মাধ্যমে অন্তর্ভুক্ত সংগ্রহ থেকে উপাদানগুলি সরিয়ে ফেলার অনুমতি দেয় te
  • পদ্ধতির নামগুলি উন্নত করা হয়েছে।

নীচের লাইনটি হ'ল উভয়ই Enumerationএবং Iteratorধারাবাহিক উপাদানগুলি দেবে, তবে Iteratorপদ্ধতিটির নামগুলি সংক্ষিপ্ততর হয় এবং এর একটি অতিরিক্ত removeপদ্ধতি রয়েছে এমনভাবে উন্নত করা হয় । এখানে পাশাপাশি পাশাপাশি তুলনা করা হচ্ছে:

  Enumeration                     Iterator
  ----------------                ----------------
  hasMoreElement()                hasNext()
  nextElement()                   next()
  N/A                             remove()

জাভা এপিআই স্পেসিফিকেশনগুলিতে যেমন উল্লেখ করা হয়েছে, নতুন প্রোগ্রামগুলির জন্য Iteratorতার চেয়ে বেশি পছন্দ করা উচিত Enumeration, কারণ "ইভাটার জাভা সংগ্রহের কাঠামোর মধ্যে গণনার স্থান গ্রহণ করে।" ( Iteratorস্পেসিফিকেশন থেকে ।)


9
আমি মনে করি সম্মতি সম্পর্কিত এই উত্তর থেকে কিছুটা ব্যাখ্যা নেই।
মার্টেন বোদেউয়েস 16

@ পল_ড্রেপার: সম্পাদনাগুলি পোস্টটিতে নতুন অর্থ যুক্ত করা উচিত নয়, মন্তব্যগুলির জন্য এটিই।
এমিল

2
@ কুকবার্ড আপনি কি "গণনা সাধারণত দ্রুত হয়"? যেহেতু গণনার "NextElement () এর ভিতরে কোডের সিঙ্ক্রোনাইজিং ব্লক রয়েছে" এবং আমাদের আইট্রেটারগুলিতে সিঙ্ক্রোনাইজেশন নেই যা কনকন্টেরমোডিশনএক্সেপশন রিটের কারণ করে ?? আমরা কি আইট্রেটারগুলিকে সাধারণত দ্রুত বলেছি এবং গণনাগুলি কিছুটা নিরাপদ। ??
কানগাভেলু সুগুমার

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

আমি মনে করি এটি ইঙ্গিতকারী ইন্টারফেসে অপসারণ () একটি anচ্ছিক পদ্ধতি এবং এটি প্রয়োগকারী শ্রেণীর অনেকগুলি প্রয়োগ করে না worth
কুট্টি

35

Iteilers ব্যর্থ দ্রুত । অর্থাত্ যখন কোনও থ্রেড সংযোজন / অপসারণ অপারেশনগুলির সাহায্যে সংগ্রহ পরিবর্তন করে, অন্য থ্রেডটি কোনও আইট্রেটারের সাহায্যে hasNext() or next()পদ্ধতি ব্যবহার করে এটি চালিয়ে যায়, পুনরুক্তি ছুড়ে দিয়ে দ্রুত ব্যর্থ হয় ConcurrentModificationException। পুনরুক্তিকারীদের ব্যর্থ-দ্রুত আচরণ কেবল বাগ সনাক্ত করতে ব্যবহার করা যেতে পারে। হ্যাশটেবল, ভেক্টরের মতো শ্রেণীর পদ্ধতি দ্বারা ফিরে আসা এনুমারেশনগুলি ব্যর্থ-দ্রুত নয় nextElement()যা বর্তমান ভেক্টর অবজেক্টটিকে লক করে রাখে এমন পদ্ধতির অভ্যন্তরে কোডের ব্লকটি সিঙ্ক্রোনাইজ করার মাধ্যমে অর্জন করা হয় যা প্রচুর সময় ব্যয় করে।


5
কেবল আংশিক সত্য: এই আচরণটি ইন্টারফেসে সংজ্ঞায়িত করা হয় না, এটি Iterator এর বাস্তবায়নের উপর নির্ভর করে। এটি সত্য যে java.util (হ্যাশসেট, অ্যারেলিস্ট ইত্যাদি) মধ্যে 'পুরানো' সংগ্রহ বাস্তবায়নগুলি এই আচরণটি প্রদর্শন করে। যাইহোক, নতুন 'সমবর্তী' সংগ্রহগুলি কখনই একটি সমকালীন মডেলিংএক্সেপশন নিক্ষেপ করবে না, তারা পুনরুক্তি তৈরির সময় হিসাবে সংগ্রহকে অতিক্রম করবে। অন্যান্য বাস্তবায়নগুলি এখনও আলাদা আচরণ দেখায়।
কুট্টি

1
এটিও উল্লেখযোগ্য: "নোট করুন যে ব্যর্থ-দ্রুত আচরণের গ্যারান্টি দেওয়া যায় না যেমন সাধারণভাবে বলা যায়, অচ্ছলিক সমান্তরাল পরিবর্তনের উপস্থিতিতে কোনও কঠোর গ্যারান্টি দেওয়া অসম্ভব F ব্যর্থ-দ্রুত অপারেশনগুলি সর্বাত্মক প্রচেষ্টার ভিত্তিতে কনকোর্নোমডিফিকেশন এক্সেক্সশনকে ফেলে দেয় Therefore সুতরাং , কোনও প্রোগ্রাম লিখতে ভুল হবে যা তার ব্যর্থতার উপর নির্ভর করে যা এর সঠিকতার জন্য: ConcurrentModificationsException কেবল বাগগুলি সনাক্ত করতে ব্যবহার করা উচিত "" docs.oracle.com/javase/7/docs/api/java/util/...
Kutzi

11

"অফিসিয়ালি", তাদের অতিরিক্ত ক্রিয়াকলাপগুলির (যেমন, অপসারণ) সমর্থনকারী পুনরাবৃত্তকারী ইন্টারফেসের সাথে একই রকম বলে মনে করা হচ্ছে। সাধারণত, প্রবণতাটি পুনরাবৃত্তকারীগুলি ব্যবহার করা হয়।

এখানে গণনা ইন্টারফেস javadocs থেকে :

দ্রষ্টব্য: এই ইন্টারফেসটির কার্যকারিতা Iterator ইন্টারফেস দ্বারা নকল করা হয়। এছাড়াও, আইট্রেটর একটি teচ্ছিক অপসারণ অপারেশন যুক্ত করে এবং এর পদ্ধতির নামগুলি ছোট হয়। নতুন বাস্তবায়নের ক্ষেত্রে গণনার অগ্রাধিকারের ক্ষেত্রে আইট্রেটার ব্যবহার করা বিবেচনা করা উচিত।


6

একটি সাধারণ সত্য তবে পূর্বের উত্তরে উল্লেখ করা হয়নি এটি Iterator<T>হ'ল Iterable<T>ব্যাখ্যামূলক for(_type_ element:collection){...}কাঠামো পরিবেশন করতে ব্যবহৃত হয় ।


5

গণনা এবং আইট্রেটারে প্রাথমিক তিনটি পার্থক্য রয়েছে

গণনা
১. এটি কেবলমাত্র লেগ্যাসি ক্লাসের জন্য ব্যবহার করা হয় (উদাঃ Vector)

    Enumeration e = v.elements();  
    v is the object of `Vector` class

2. পড়ুন অপারেশন সম্পাদন করা যেতে পারে, আমরা উপাদান অপসারণ করতে পারবেন না।
৩. দুটি পদ্ধতি উপলব্ধ

  • পাবলিক বুলিয়ান হ্যাস্টেক্সটমেন্ট ();
  • পাবলিক অবজেক্ট নেক্সটমেন্ট ();

iterator

  1. এটি সমস্ত সংগ্রহের জন্য প্রযোজ্য

    Iterator itr = c.iterator();  
    where c is any `Collection` class
  2. পড়ুন এবং অপসারণ অপারেশন সম্পাদন করা যেতে পারে

  3. তিনটি পদ্ধতি উপলব্ধ

    • পাবলিক বুলিয়ান hasNext ();
    • পাবলিক অবজেক্ট পরবর্তী ();
    • সর্বজনীন শূন্যতা অপসারণ ();

উভয় মধ্যে সীমাবদ্ধতা

  • কেবল সামনের দিকে এগিয়ে যান
  • Add objectএবং এর জন্য কোনও পদ্ধতি নেইReplace object

2

আপনি যদি নিজের সংগ্রহের শ্রেণি লিখছেন, এবং আপনি বিদ্যমান ক্লাসগুলির কোনও প্রসারিত করছেন বা সংগ্রহ কাঠামো ইন্টারফেসগুলির কোনও প্রয়োগ করছেন, তবে আপনার কাছে মূলত আইট্রেটর ব্যবহার করার বিকল্প নেই।

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


2

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


এটি সত্য যে গণনা অপসারণ () পদ্ধতিটি "প্রকাশ করে না" - তবে এটি সংগ্রহের অপসারণ () এপিআইয়ের দিকেও মনোযোগ দেয় না। উদাহরণস্বরূপ নিম্নলিখিত কোডগুলি কেবল মুদ্রণ করবে: এএএ, সিসিসি, ইইই। -------------------------------------------------- --- ভেক্টর <স্ট্রিং> ভি = নতুন ভেক্টর <স্ট্রিং> (6); v.add ( "AAA যাচাই"); v.add ( "হন তবে আপনার"); v.add ( "চট্টগ্রাম সিটি করপোরেশন"); v.add ( "DDD"); v.add ( "ইইই"); v.add ( "FFF"); গণনা <স্ট্রিং> এন = ভি.এলিমেন্টস (); যখন (en.hasMoreElements ()) স্ট্রিং মান = (স্ট্রিং) en.nextElement (); System.out.println (মান); v.remove (মান);
javauser71

1

1) Iterator এবং গণনা মধ্যে প্রধান পার্থক্য সংগ্রহ সরানোর সময় উপাদান অপসারণ হয়। আইট্রেটর সংগ্রহের ট্র্যাভারসাল চলাকালীন উপাদানটিকে মুছে ফেলতে পারে কারণ এটি () পদ্ধতিটি মুছে ফেলে। গণনার কাছে অপসারণ পদ্ধতি () নেই।

2) প্রকৃতিতে গণনা ব্যর্থ-নিরাপদ। ট্র্যাভারসাল চলাকালীন যদি সংগ্রহটি সংশোধিত করা হয় তবে এটি কনকন্টারমোডিফিকেশন এক্সেক্সশনটি ছুঁড়ে না। Iterator প্রকৃতির ব্যর্থ দ্রুত। এটি সংগ্রহের নিজস্ব অপসারণ () পদ্ধতি ব্যতীত পুনরাবৃত্ত করার সময় যদি কোনও সংশোধন করা হয় তবে এটি কনকন্টারমোডিফিকেশন এক্সেক্সশনটি ছুড়ে ফেলে।

3) গণনা একটি উত্তরাধিকার ইন্টারফেস যা ভেক্টর, হ্যাশটেবলকে অনুসরণ করার জন্য ব্যবহৃত হয়। আইট্রেটার কোনও উত্তরাধিকারের ইন্টারফেস নয়। আইট্রেটারটি হ্যাশম্যাপ, লিংকডলিস্ট, অ্যারেলিস্ট, হ্যাশসেট, ট্রিম্যাপ, ট্রিসেটের ট্র্যাভারসালের জন্য ব্যবহার করা যেতে পারে।


0

গণনাটি কেবলমাত্র উত্তরাধিকার শ্রেণীর জন্য (ভেক্টর, স্ট্যাক ...) ব্যবহার করা যেতে পারে, তবে আইট্রেটরটি সবার জন্য ব্যবহার করা যেতে পারে।


-1

পুনরুক্তি এবং গণনা উভয়ই তথ্য পুনরুদ্ধার করতে ব্যবহৃত হয়, পার্থক্য হ'ল গণনাটি কেবলমাত্র উত্তরাধিকার শ্রেণিতে অর্থাৎ ভেক্টর / স্ট্যাকের জন্য ব্যবহার করা যেতে পারে তবে বাকীগুলির জন্য পুনরুক্তি ব্যবহার করা যেতে পারে। মানচিত্রে কী সেট করার জন্য গণনাও ব্যবহার করা যেতে পারে।


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