আমরা কি জাভাতে নিজের ইউটরেটর লিখতে পারি?


103

আমার যদি একটি তালিকা রয়েছে [alice, bob, abigail, charlie]এবং আমি একটি পুনরুক্তি লিখতে চাই যাতে এটি 'ক' দিয়ে শুরু হওয়া উপাদানগুলির উপরে পুনরাবৃত্তি হয়, আমি কি আমার নিজের লিখতে পারি? আমি এটা কিভাবে করবো ?


4
আপনি পারেন। আপনাকে আইট্রেটার ইন্টারফেসটি প্রয়োগ করতে হবে।
gd1

অবশ্যই, এটি একটি সাধারণ ইন্টারফেস। জেডিও প্রেরণের জন্য java.util প্রক্সিং করা হচ্ছে। কাস্টম পুনরাবৃত্তি প্রচুর জড়িত।
বেটসেস

উত্তর:


48

অবশ্যই। একটি পুনরাবৃত্তি java.util.Iteratorইন্টারফেসের কেবল একটি বাস্তবায়ন । যদি আপনি কোনও বিদ্যমান পুনরাবৃত্তিযোগ্য অবজেক্ট (বলুন, ক LinkedList) ব্যবহার করছেন তবে আপনাকে java.utilএটির সাবক্লাস করতে হবে এবং এর iteratorক্রিয়াকে ওভাররাইড করতে হবে যাতে আপনি নিজের নিজের ফিরে আসতে পারেন, বা আপনার বিশেষ Iteratorপরিস্থিতিতে একটি আদর্শ পুনরাবৃত্তিকে মোড়ানোর একটি উপায় সরবরাহ করতে পারেন (যা আরও ব্যাপকভাবে ব্যবহৃত হওয়ার সুবিধা রয়েছে) ইত্যাদি etc.


8
ভাল উত্তর .... +1 তবে আপনাকে সাবক্লাস লিংকডলিস্ট বাধ্য করতে বাধ্য করা হচ্ছে না। ইন্টারফেসগুলি কনস্ট্রাক্টর সম্পর্কে কিছুই না বলে আপনি একটি কাস্টমআইটরেটর লিখতে পারেন যে এটি নতুন কাস্টমআইটরেটরের (ইনস্টিস্টাল) দিয়ে ইনস্ট্যান্ট করা আছে।
gd1

1
@ গিয়াকোমো: "... বা আপনার বিশেষ Iteratorপরিস্থিতিতে একটি আদর্শ পুনরাবৃত্তিকে মোড়ানোর একটি উপায় সরবরাহ করুন ..." (এবং ধন্যবাদ) এর অর্থ এটাই ছিল । :-)
টিজে ক্রাউডার

195

সর্বোত্তম পুনঃব্যবহারযোগ্য বিকল্প হ'ল ইন্টারফেসটি পরিলক্ষিত এবং পদ্ধতি পুনরাবৃত্তকারী () এর ওভাররাইড করা।

ইন্টারফেস প্রয়োগকারী শ্রেণীর মতো অ্যারেলিস্টের একটি উদাহরণ এখানে আপনি পদ্ধতি আইট্রেটার () কে ওভাররাইড করেন।

import java.util.Iterator;

public class SOList<Type> implements Iterable<Type> {

    private Type[] arrayList;
    private int currentSize;

    public SOList(Type[] newArray) {
        this.arrayList = newArray;
        this.currentSize = arrayList.length;
    }

    @Override
    public Iterator<Type> iterator() {
        Iterator<Type> it = new Iterator<Type>() {

            private int currentIndex = 0;

            @Override
            public boolean hasNext() {
                return currentIndex < currentSize && arrayList[currentIndex] != null;
            }

            @Override
            public Type next() {
                return arrayList[currentIndex++];
            }

            @Override
            public void remove() {
                throw new UnsupportedOperationException();
            }
        };
        return it;
    }
}

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

আপনি কেবলমাত্র ইটারেটর না বাড়িয়েই পুনরাবৃত্তির একটি বেনামে উদাহরণ তৈরি করতে পারেন এবং অ্যারের উপরে আপনি কোথায় যেতে পারবেন তা যাচাই করার জন্য কারেন্ট সাইজের মানটির সুবিধা নিতে পারেন (ধরা যাক যে আপনি 10 এর ক্ষমতা সহ একটি অ্যারে তৈরি করেছেন, তবে আপনার কাছে কেবল 2 আছে) 0 এবং 1 এ উপাদান)। উদাহরণটিতে এর মালিকের কাউন্টারটি এটি কোথায় থাকবে এবং আপনাকে যা করতে হবে তা হ্যাশেক্সট () এর সাথে খেলতে হবে যা বর্তমান মানটি নাল নয় এবং যা পরের () দ্বারা যাচাই করে যা আপনার বর্তমান সূচকটির উদাহরণটি ফিরিয়ে দেবে। নীচে এই এপিআই ব্যবহারের উদাহরণ দেওয়া আছে ...

public static void main(String[] args) {
    // create an array of type Integer
    Integer[] numbers = new Integer[]{1, 2, 3, 4, 5};

    // create your list and hold the values.
    SOList<Integer> stackOverflowList = new SOList<Integer>(numbers);

    // Since our class SOList is an instance of Iterable, then we can use it on a foreach loop
    for(Integer num : stackOverflowList) {
        System.out.print(num);
    }

    // creating an array of Strings
    String[] languages = new String[]{"C", "C++", "Java", "Python", "Scala"};

    // create your list and hold the values using the same list implementation.
    SOList<String> languagesList = new SOList<String>(languages);

    System.out.println("");
    // Since our class SOList is an instance of Iterable, then we can use it on a foreach loop
    for(String lang : languagesList) {
        System.out.println(lang);
    }
}
// will print "12345
//C
//C++
//Java
//Python
//Scala

আপনি যদি চান তবে আপনি এটির সাথে পুনরায় পুনরুক্তি করতে পারেন Iterator উদাহরণটি ব্যবহার করে:

// navigating the iterator
while (allNumbers.hasNext()) {
    Integer value = allNumbers.next();
    if (allNumbers.hasNext()) {
        System.out.print(value + ", ");
    } else {
        System.out.print(value);
    }
} 
// will print 1, 2, 3, 4, 5

ফোরচ ডকুমেন্টেশনটি http://download.oracle.com/javase/1,5.0/docs/guide/language/foreach.html এ অবস্থিত । আপনি আমার ব্যক্তিগত অনুশীলন গুগল কোডে আরও সম্পূর্ণ বাস্তবায়নটি একবার দেখে নিতে পারেন ।

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


14
for instance, এটা কি একটা পাং?
n611x007

4
30 জন অন্য লোকেরা এটিকে পাং বলে মনে করেনি :)
মার্সেলো ডি বিক্রয়

2
আমাদের প্রয়োগ করা পদ্ধতিগুলি থেকে অসমর্থিত অপারেশন ব্যতিক্রম ছুঁড়ে ফেলা ভাল অনুশীলন। আমি মনে করি অপসারণ () পদ্ধতি থেকে অসমর্থিত অপারেশন ব্যতিক্রম ছুঁড়ে ফেলা ভাল ধারণা!
দর্শনা

2
দুঃখিত @ দর্শণ, তবে এই সমাধানটি "পুনরাবৃত্তকারীদের কীভাবে লিখবেন" র সাথে সম্পর্কিত ... যদি "নিখুঁতভাবে লিখিত কোড লিখতে" হত তবে তা সেখানে হত!
মার্সেলো ডি বিক্রয় 21

স্পষ্ট নয় কেন 'অ্যারেলিস্ট [কারেন্টআইডেক্স]! = নাল' চেক হ্যাশনেস্ট () এর ভিতরে প্রয়োজন। কেউ দয়া করে ব্যাখ্যা করতে পারেন?
ভূষণ কর্মারকার

12

গুণগত পরিসংখ্যান গণ্য করার জন্য ভাল উদাহরণ

FactorialIterable fi = new FactorialIterable(10);
Iterator<Integer> iterator = fi.iterator();
while (iterator.hasNext()){
     System.out.println(iterator.next());
}

জাভা 1.8 এর জন্য সংক্ষিপ্ত কোড

new FactorialIterable(5).forEach(System.out::println);

কাস্টম ইটারেবল ক্লাস

public class FactorialIterable implements Iterable<Integer> {

    private final FactorialIterator factorialIterator;

    public FactorialIterable(Integer value) {
        factorialIterator = new FactorialIterator(value);
    }

    @Override
    public Iterator<Integer> iterator() {
        return factorialIterator;
    }

    @Override
    public void forEach(Consumer<? super Integer> action) {
        Objects.requireNonNull(action);
        Integer last = 0;
        for (Integer t : this) {
            last = t;
        }
        action.accept(last);
    }

}

কাস্টম Iterator বর্গ

public class FactorialIterator implements Iterator<Integer> {

    private final Integer mNumber;
    private Integer mPosition;
    private Integer mFactorial;


    public FactorialIterator(Integer number) {
        this.mNumber = number;
        this.mPosition = 1;
        this.mFactorial = 1;
    }

    @Override
    public boolean hasNext() {
        return mPosition <= mNumber;
    }

    @Override
    public Integer next() {
        if (!hasNext())
            return 0;

        mFactorial = mFactorial * mPosition;

        mPosition++;

        return  mFactorial;
    }
}

8

এটি একটি পুনরুক্তি লেখার সম্পূর্ণ কোড যা এটি 'এ' দিয়ে শুরু হওয়া উপাদানগুলির উপরে পুনরাবৃত্তি করে:

import java.util.Iterator;

public class AppDemo {

    public static void main(String args[]) {

        Bag<String> bag1 = new Bag<>();

        bag1.add("alice");
        bag1.add("bob"); 
        bag1.add("abigail");
        bag1.add("charlie"); 

        for (Iterator<String> it1 = bag1.iterator(); it1.hasNext();) {

            String s = it1.next();
            if (s != null)
                System.out.println(s); 
        }
    }
}

কাস্টম Iterator বর্গ

import java.util.ArrayList;
import java.util.Iterator;

public class Bag<T> {

    private ArrayList<T> data;

    public Bag() {

        data = new ArrayList<>();
    }

    public void add(T e) {

        data.add(e); 
    }

    public Iterator<T> iterator() {

        return new BagIterator();
    }

    public class BagIterator<T> implements Iterator<T> {

        private int index; 
        private String str;

        public BagIterator() {

            index = 0;
        }

        @Override
        public boolean hasNext() {

             return index < data.size();  
        }

        @Override
        public T next() {

            str = (String) data.get(index); 
            if (str.startsWith("a"))
                return (T) data.get(index++); 
            index++; 
            return null; 
        }
    } 
}

5

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


1

এখানে প্রশ্নের সম্পূর্ণ উত্তর দেওয়া হল।

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;

class ListIterator implements Iterator<String>{
    List<String> list;
    int pos = 0;

    public ListIterator(List<String> list) {
        this.list = list;
    }

    @Override
    public boolean hasNext() {
        while(pos < list.size()){
            if (list.get(pos).startsWith("a"))
                return true;
            pos++;
        }
        return false;

    }

    @Override
    public String next() {
        if (hasNext())
            return list.get(pos++);
        throw new NoSuchElementException();
    }
}

public class IteratorTest {

    public static void main(String[] args) {
        List<String> list = Arrays.asList("alice", "bob", "abigail", "charlie");
        ListIterator itr = new ListIterator(list);

        while(itr.hasNext())
            System.out.println(itr.next()); // prints alice, abigail
    }
}
  • ListIterator অ্যারের জন্য পুনরাবৃত্তি যা 'এ' দিয়ে শুরু হওয়া উপাদানগুলি ফেরত দেয়।
  • একটি Iteable ইন্টারফেস প্রয়োগ করার প্রয়োজন নেই। তবে এটাই সম্ভাবনা।
  • এটিকে উদারভাবে প্রয়োগ করার দরকার নেই।
  • এটি হ্যান্সেক্সট () এবং পরবর্তী () এর জন্য চুক্তিটিকে পুরোপুরি সন্তুষ্ট করে। উদাহরণস্বরূপ যদি হ্যাজনেক্সট () বলছে যে এখনও উপাদান রয়েছে, পরের () সেই উপাদানগুলি ফিরিয়ে দেবে। এবং যদি হ্যাজনেক্সট () আরও উপাদান না বলে, এটি একটি বৈধ NoSuchElementExceptionব্যতিক্রম ফিরিয়ে দেয় ।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.