পুনরাবৃত্তকারী এবং পুনরাবৃত্তিযোগ্য এবং সেগুলি কীভাবে ব্যবহার করতে হয় তার মধ্যে পার্থক্য কী?


195

আমি জাভাতে নতুন এবং আমি পুনরাবৃত্তকারী এবং পুনরাবৃত্তের সাথে সত্যিই বিভ্রান্ত। কেউ কি আমাকে বুঝিয়ে কিছু উদাহরণ দিতে পারেন?

উত্তর:


200

একটি Iterableহ'ল উপাদানগুলির ধারাবাহিকতার একটি সহজ উপস্থাপনা যা পুনরাবৃত্তি হতে পারে। এটির কোনও পুনরাবৃত্তির অবস্থা নেই যেমন "বর্তমান উপাদান"। পরিবর্তে, এটির একটি পদ্ধতি রয়েছে যা একটি উত্পাদন করে Iterator

একটি Iteratorপুনরাবৃত্তির স্থিতি সহ একটি বস্তু। এটি আপনাকে ব্যবহার করতে আরও উপাদান রয়েছে কিনা তা যাচাই করতে দেয় hasNext()এবং ব্যবহার করে পরবর্তী উপাদানগুলিতে (যদি থাকে) সরাতে দেয় next()

সাধারণত, একটি Iterableবৈধ Iteratorগুলি যে কোনও সংখ্যক উত্পাদন করতে সক্ষম হওয়া উচিত ।


করবে ব্যাপার যদি Iterableগেছে interalবা externalতাদের কোন পুনরুক্তিকারীর বা এটা সম্ভব কিভাবে?
সখুনজাই

90

এর একটি বাস্তবায়ন যা নিজের Iterableএকটি সরবরাহ Iteratorকরে:

public interface Iterable<T>
{
    Iterator<T> iterator();
}

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

public interface Iterator<E>
{
    boolean hasNext();
    E next();
    void remove();
}

জাভাদোক দেখুন ।


16

আপনাকে আরও বুঝতে সাহায্য করার জন্য আমি উদাহরণ হিসাবে উদাহরণস্বরূপ অ্যারেলিস্ট সম্পর্কে প্রশ্নের উত্তর দেব ...

  1. অপরিবর্তনীয় ইন্টারফেস তার সাবক্লাসগুলি বিমূর্ত পদ্ধতি 'পুনরায় ()' প্রয়োগ করতে বাধ্য করে।
public interface Iterable {
  ...
  abstract Iterator<T> iterator(); //Returns an 'Iterator'(not iterator) over elements of type T.
  ...
}
  1. আইট্রেটার ইন্টারফেস তার সাবক্লাসগুলিকে বিমূর্ত পদ্ধতি 'hasNext ()' এবং 'পরবর্তী ()' প্রয়োগ করতে বাধ্য করে।
public interface Iterator {
  ...
  abstract boolean hasNext(); //Returns true if the iteration has more elements.
  abstract E next();          //Returns the next element in the iteration.
  ...
}
  1. অ্যারেলিস্টের তালিকা প্রয়োগ করে, তালিকা সংগ্রহকে বাড়ায় এবং সংগ্রহটি Iterable প্রসারিত হয় .. এটি হল আপনি সম্পর্কটি দেখতে পেলেন

    'পরিলক্ষিত <- সংগ্রহ <- তালিকা <- অ্যারেলিস্ট "

। এবং লক্ষণীয়, সংগ্রহ এবং তালিকা কেবল বিমূর্ত পদ্ধতি 'পুনরাবৃত্তকারী ()' ঘোষণা করে এবং অ্যারেলিস্ট একাই এটি প্রয়োগ করে।

  1. আমি আরও বিশদ তথ্যের জন্য নীচে 'পুনরুক্তি ()' পদ্ধতি সহ অ্যারেলিস্ট উত্স কোডটি প্রদর্শন করতে যাচ্ছি।

'পুনরাবৃত্তকারী' () পদ্ধতিটি 'Itr' শ্রেণীর একটি অবজেক্ট প্রদান করে যা 'Iterator' প্রয়োগ করে।

public class ArrayList<E> ... implements List<E>, ...
{
  ...
  public Iterator<E> iterator() {
              return new Itr();
  }


  private class Itr implements Iterator<E> {
          ...

          public boolean hasNext() {
              return cursor != size;
          }
          @SuppressWarnings("unchecked")
          public E next() {
              checkForComodification();
              int i = cursor;
              if (i >= size)
                  throw new NoSuchElementException();
              Object[] elementData = ArrayList.this.elementData;
              if (i >= elementData.length)
                  throw new ConcurrentModificationException();
              cursor = i + 1;
              return (E) elementData[lastRet = i];
          }
          ...
  }
}
  1. কিছু অন্যান্য পদ্ধতি বা ক্লাস Iterator (Itr) ব্যবহারের মাধ্যমে অ্যারেলিস্টের মতো সংগ্রহের উপাদানগুলিকে পুনরাবৃত্তি করবে।

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

public static void main(String[] args) {

    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");
    list.add("e");
    list.add("f");

    Iterator<String> iterator = list.iterator();
    while (iterator.hasNext()) {
        String string = iterator.next();
        System.out.println(string);
    }
}

এখন, এটা কি পরিষ্কার? :)


দুর্দান্ত উত্তর!
কবিন্দু দোদানডুয়া

আমি এই পোস্টটি বুঝতে পেরেছি, তবে যদি আমি এমন কোনও পদ্ধতি লিখতে চাই যার রিটার্ন টাইপ হয় Iterable<T>তবে এই দৃশ্যে আমাদের কোন পদক্ষেপগুলি প্রয়োগ করতে হবে? দয়া করে সেই উদাহরণটিও পরামর্শ দিন।
প্রসন্ন সাসনে

12

যদি সংগ্রহটি পুনরাবৃত্ত হয়, তবে এটি একটি পুনরুক্তি ব্যবহার করে পুনরাবৃত্তি করা যেতে পারে (এবং ফলস্বরূপ প্রতিটি লুপের জন্য একটিতে ব্যবহার করা যেতে পারে)) পুনরুক্তি করা আসল বস্তু যা সংগ্রহের মাধ্যমে পুনরাবৃত্তি হবে।


2
FYI a java.util. Colલેક્શન সর্বদা java.util.Iterable প্রয়োগ করে।
পল ড্রাগন

2
তাই না java.lang.Iterable?
ulab

এটিjava.lang.Iterable
aldok

9

আইটেবল ইন্টারফেস প্রয়োগ করা কোনও বস্তুকে "ফোরচ" স্টেটমেন্টের লক্ষ্য হতে দেয়।

class SomeClass implements Iterable<String> {}

class Main 
{
  public void method()
  {
     SomeClass someClass = new SomeClass();
     .....

    for(String s : someClass) {
     //do something
    }
  }
}

Iterator একটি ইন্টারফেস, যা উপাদানগুলির উপর পুনরাবৃত্তি জন্য বাস্তবায়ন আছে। Iterable একটি ইন্টারফেস যা Iterator সরবরাহ করে।


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

হ্যাঁ. এটিতে ইন্টারফেসের অযৌক্তিক পদ্ধতি থাকা উচিত। এই ক্ষেত্রে এটি Iterator হয়।
এজেন্ট.স্মিত

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

আমার জন্য, এটি সেরা উত্তর।
স্যাম

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

8

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


আমি ভাবছিলাম যে কেন সংগ্রহ ক্লাসগুলি সরাসরি আইট্রেটার ইন্টারফেস প্রয়োগ করে না (পরিবর্তে Iteable এবং Iterator অবজেক্টটি বাস্তবায়নের পরিবর্তে)। এই উত্তরটি পরিষ্কার করে দিয়েছে যে - এক্ষেত্রে একাধিক বার সংগ্রহ করা (এবং একসাথে একাধিক থ্রেড দ্বারাও) সম্ভব হত না। এটি খুব গুরুত্বপূর্ণ উত্তর।
সরলদেব

2

এখানে ব্যাখ্যা হিসাবে , " Iteable " foreachলুপ ব্যবহার করতে সক্ষম হতে চালু করা হয়েছিল । আইটেবল ইন্টারফেস প্রয়োগকারী একটি শ্রেণি পুনরাবৃত্তি হতে পারে।

Iterator একটি শ্রেণিবদ্ধ যা একটি Iteable উপর পুনরাবৃত্তি পরিচালনা করে । এটি বর্তমানের পুনরাবৃত্তিতে আমরা কোথায় রয়েছি তার একটি অবস্থা বজায় রাখে এবং পরবর্তী উপাদানটি কী এবং এটি কীভাবে পাওয়া যায় তা জানে।


2

10 টি আপেল থাকার একটি উদাহরণ বিবেচনা করুন। যখন এটি ইটারেবল প্রয়োগ করে, এটি প্রতিটি আপেলকে 1 থেকে 10 পর্যন্ত বাক্সে রাখার মতো এবং পুনরুদ্ধার করতে ব্যবহৃত একটি পুনরাবৃত্তিকে ফিরিয়ে দেওয়ার মতো।

পুনরুক্তি কার্যকর করে, আমরা যে কোনও আপেল, পরের বাক্সগুলিতে অ্যাপল পেতে পারি etc.

সুতরাং পুনরাবৃত্তির প্রয়োগকারী একটি উপাদানকে তার উপাদানগুলি নেভিগেট করতে দেয় যদিও নেভিগেট করতে গেলে, পুনরুক্তি প্রয়োগ করতে হবে।


1

প্রশ্ন: Iteable এবং Iterator মধ্যে পার্থক্য?
উত্তর:

পুনরাবৃত্তিযোগ্য: এটি forEach লুপ সম্পর্কিত
পুনরুক্তি সংগ্রহের সাথে সম্পর্কিত

ForEach লুপ শ্যুবলের লক্ষ্য উপাদানটি পুনরাবৃত্ত হতে পারে।
সংগ্রহ থেকে এক এক করে অবজেক্টটি পেতে আমরা আইট্রেটার ব্যবহার করতে পারি

Java.ḷang প্যাকেজে উপস্থিত অপ্রয়োজনীয়
উপস্থিত Iterator উপস্থিত java.util প্যাকেজের উপস্থিতি

কেবলমাত্র একটি পদ্ধতি পুনরুক্তি () রয়েছে
পুনরাবৃত্তকারী রয়েছে তিনটি পদ্ধতির রয়েছে নেক্সট (), পরবর্তী (), সরান ()

1.5 সংস্করণে
উপস্থাপিত হয়েছে 1.2 সংস্করণে পরিচিত


1

মূলত বলতে গেলে উভয়ই একে অপরের সাথে খুব জড়িত।

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

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

যখন কোনও সংগ্রহ পুনরাবৃত্ত হয়, তখন এটি একটি পুনরুক্তি ব্যবহার করে পুনরাবৃত্তি করা যেতে পারে।

বোঝার জন্য এই দেখুন:

ITERABLE: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Iterable.java

আইটিইটিএটার http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Iterator.java


1

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে যে কেউ এই প্রশ্নটি নিয়ে একই প্রশ্নে আটকে আছে এবং যিনি সমস্ত পরিভাষায় অভিভূত হতে পারেন তার জন্য, পুনরাবৃত্ত এবং পুনরুক্তির মধ্যে এই পার্থক্য বুঝতে আপনাকে সহায়তা করার জন্য এখানে একটি ভাল, সাধারণ উপমা দেওয়া হয়েছে:

একটি পাবলিক লাইব্রেরি চিন্তা করুন। পুরানো স্কুল. কাগজের বই নিয়ে। হ্যাঁ, এ জাতীয় গ্রন্থাগার।

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

লাইব্রেরিয়ানটি পুনরাবৃত্তকারীর মতো হবে। তিনি যে কোনও মুহুর্তে একটি নির্দিষ্ট বইয়ের দিকে নির্দেশ করতে পারেন। তিনি যে স্থানে ইশারা করছেন সেখানে বই সন্নিবেশ / অপসারণ / সংশোধন / পড়তে পারেন। তিনি ক্রমানুসারে প্রতিটি বইয়ের প্রতি নির্দেশ দিয়েছেন প্রতিবার যখন আপনি "পরের!" তাকে. সুতরাং, আপনি সাধারণত তাকে জিজ্ঞাসা করতেন: "এর পরেরটি আছে?", এবং তিনি "হ্যাঁ" বলবেন, যার কাছে আপনি "পরের!" এবং সে পরের বইটিতে নির্দেশ করবে point তিনি শেল্ফের শেষে কখন পৌঁছেছেন তাও তিনি জানেন, যাতে আপনি যখন জিজ্ঞাসা করবেন: "পরেরটি আছে?" সে "না" বলবে।

আমি জানি এটি কিছুটা নিরীহ, তবে আমি আশা করি এটি সাহায্য করবে।


0

কলিনডি এবং সিকার উত্তরগুলি ছাড়াও ।

সহজ কথায়, Iteable এবং Iterator উভয় জাভা সংগ্রহ ফ্রেমওয়ার্ক সরবরাহ করা ইন্টারফেস হয়।

Iterable

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

iterableElements.forEach (x -> System.out.println(x) );

iterator

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

for (Iterator i = c.iterator(); i.hasNext(); ) {
       Element e = i.next();    //Get the element
       System.out.println(e);    //access or modify the element
}

সূত্র:

  1. জাভা ডক ইটারেবল
  2. জাভা ডক আইট্রেটার

0

Iterable জাভা প্রতিটি লুপ জন্য ব্যবহার করার জন্য চালু করা হয়েছিল

public interface Collection<E> extends Iterable<E>  

Iteratorএমন একটি শ্রেণি যা একটির উপরে পুনরাবৃত্তি পরিচালনা করে Iterable। এটি বর্তমানের পুনরাবৃত্তিতে আমরা কোথায় রয়েছি তার একটি অবস্থা বজায় রাখে এবং পরবর্তী উপাদানটি কী এবং এটি কীভাবে পাওয়া যায় তা জানে।


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