Java Academy · पाठ

Custom Iterator लागू करना

किसी सरल linked list या range structure के लिए custom iterator class बनाएँ।

पाठ 2, कुल 4 में से14 चरण

Custom Iterator लागू करना, CoddyKit पर Java Academy का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Java Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

कस्टम Iterator

कस्टम Iterator बनाने से आपको डेटा संरचना पर चलने के तरीके का पूरा नियंत्रण मिलता है। इस पाठ में लिंक्ड-सूची Iterator को चरण-दर-चरण लागू करना बताया गया है।

Node वर्ग

सबसे पहले, एकल-लिंक्ड सूची के लिए नोड संरचना परिभाषित करें।

class Node<T> {
    final T value;
    Node<T> next;

    Node(T value) {
        this.value = value;
    }
}

// Building a chain: 1 -> 2 -> 3
Node<Integer> head = new Node<>(1);
head.next = new Node<>(2);
head.next.next = new Node<>(3);

Iterator को implementing करना

एक ऐसा आंतरिक वर्ग बनाएँ जो Iterator<T> को लागू करता हो और जिसका स्थिति-सूचक वर्तमान नोड की ओर संकेत करता हो।

import java.util.Iterator;
import java.util.NoSuchElementException;

class LinkedList<T> implements Iterable<T> {
    private Node<T> head;
    private int size;

    private class LinkedListIterator implements Iterator<T> {
        private Node<T> current = head; // cursor

        @Override
        public boolean hasNext() {
            return current != null;
        }

        @Override
        public T next() {
            if (!hasNext()) throw new NoSuchElementException();
            T value = current.value;
            current = current.next;
            return value;
        }
    }

    @Override
    public Iterator<T> iterator() {
        return new LinkedListIterator();
    }
}

addFirst और पूर्ण LinkedList

नोड को सबसे आगे जोड़ने की क्षमता जोड़ें और पूरा कार्यशील वर्ग देखें।

class LinkedList<T> implements Iterable<T> {
    private Node<T> head;
    private int size;

    public void addFirst(T value) {
        Node<T> node = new Node<>(value);
        node.next = head;
        head = node;
        size++;
    }

    public void addLast(T value) {
        Node<T> node = new Node<>(value);
        if (head == null) { head = node; }
        else {
            Node<T> curr = head;
            while (curr.next != null) curr = curr.next;
            curr.next = node;
        }
        size++;
    }

    public int size() { return size; }

    @Override
    public Iterator<T> iterator() {
        return new LinkedListIterator();
    }
}

कस्टम Iterator का उपयोग

Iterable इंटरफ़ेस लागू होने के बाद, लिंक्ड सूची प्रत्येक-तत्व लूप और forEach के साथ काम करती है।

LinkedList<String> list = new LinkedList<>();
list.addLast("Alice");
list.addLast("Bob");
list.addLast("Charlie");

// For-each loop works!
for (String name : list) {
    System.out.println(name);
}
// Alice
// Bob
// Charlie

// Stream also works (Java 8+)
list.forEach(name -> System.out.println("Hello, " + name));

Range Iterator

एक सरल उदाहरण: किसी आधारभूत डेटा संरचना के बिना संख्यात्मक सीमा पर चलने वाला इटरेटर।

class IntRange implements Iterable<Integer> {
    private final int start, end, step;

    IntRange(int start, int end, int step) {
        this.start = start; this.end = end; this.step = step;
    }
    IntRange(int start, int end) { this(start, end, 1); }

    @Override
    public Iterator<Integer> iterator() {
        return new Iterator<>() {
            int current = start;
            public boolean hasNext() { return current < end; }
            public Integer next() {
                if (!hasNext()) throw new NoSuchElementException();
                int val = current;
                current += step;
                return val;
            }
        };
    }
}

for (int n : new IntRange(0, 10, 2)) System.out.print(n + " ");
// 0 2 4 6 8

वृक्ष का मध्यक्रम Iterator

स्पष्ट स्टैक का उपयोग करके मध्यक्रम BST Iterator लागू करना — यह दर्शाता है कि इटरेटर पुनरावर्ती संचरण का स्थान ले सकते हैं।

import java.util.*;

class BinaryTree<T extends Comparable<T>> {
    private record TreeNode<T>(T val, TreeNode<T> left, TreeNode<T> right) {}

    private TreeNode<T> root;

    public Iterator<T> inorderIterator() {
        Deque<TreeNode<T>> stack = new ArrayDeque<>();
        pushLeft(root, stack);
        return new Iterator<>() {
            public boolean hasNext() { return !stack.isEmpty(); }
            public T next() {
                TreeNode<T> node = stack.pop();
                pushLeft(node.right(), stack);
                return node.val();
            }
        };
    }

    private void pushLeft(TreeNode<T> node, Deque<TreeNode<T>> stack) {
        while (node != null) { stack.push(node); node = node.left(); }
    }
}

विलंबित Iterator

इटरेटर मानों को विलंबित रूप से बना सकते हैं — केवल तभी जब next() को कॉल किया जाए। यह अनंत अनुक्रमों के लिए उपयोगी है।

class FibonacciIterator implements Iterator<Long> {
    private long a = 0, b = 1;

    @Override public boolean hasNext() { return true; } // infinite!

    @Override public Long next() {
        long result = a;
        long next = a + b;
        a = b;
        b = next;
        return result;
    }
}

Iterator<Long> fib = new FibonacciIterator();
for (int i = 0; i < 10; i++) System.out.print(fib.next() + " ");
// 0 1 1 2 3 5 8 13 21 34

फ़िल्टर किया हुआ Iterator

एक आवरणकारी इटरेटर, जो किसी अन्य इटरेटर को लपेटता है और ऐसे तत्वों को छोड़ देता है जो किसी विधेय से मेल नहीं खाते।

import java.util.*;
import java.util.function.*;

class FilterIterator<T> implements Iterator<T> {
    private final Iterator<T> source;
    private final Predicate<T> predicate;
    private T next;
    private boolean hasNext;

    FilterIterator(Iterator<T> source, Predicate<T> predicate) {
        this.source = source; this.predicate = predicate;
        advance();
    }

    private void advance() {
        hasNext = false;
        while (source.hasNext()) {
            T candidate = source.next();
            if (predicate.test(candidate)) { next = candidate; hasNext = true; break; }
        }
    }

    public boolean hasNext() { return hasNext; }
    public T next() { T val = next; advance(); return val; }
}

List<Integer> nums = List.of(1,2,3,4,5,6,7,8,9,10);
Iterator<Integer> evens = new FilterIterator<>(nums.iterator(), n -> n % 2 == 0);
while (evens.hasNext()) System.out.print(evens.next() + " ");
// 2 4 6 8 10

Iterator और Stream का एकीकरण

कस्टम इटरेटर को Spliterators.spliteratorUnknownSize() का उपयोग करके Streams में बदला जा सकता है।

import java.util.*;
import java.util.stream.*;

Iterator<Integer> rangeIt = new IntRange(1, 6).iterator();

Stream<Integer> stream = StreamSupport.stream(
    Spliterators.spliteratorUnknownSize(rangeIt, Spliterator.ORDERED),
    false // not parallel
);

int sum = stream.mapToInt(Integer::intValue).sum();
System.out.println(sum); // 15

पुनरावृत्ति के दौरान हटाना

Iterator की वैकल्पिक remove() विधि, अंतिम next() कॉल से लौटाए गए तत्व को हटाती है — कस्टम इटरेटर में इसे स्पष्ट रूप से लागू करना आवश्यक है।

class MutableLinkedList<T> implements Iterable<T> {
    // ... (full implementation)

    // Iterator with remove support
    private class RemovableIterator implements Iterator<T> {
        private Node<T> prev = null;
        private Node<T> current = head;

        public boolean hasNext() { return current != null; }
        public T next() {
            prev = (prev == null) ? null : current;
            T val = current.value;
            current = current.next;
            return val;
        }

        public void remove() {
            // Remove the last returned node
            if (prev == null) head = current;
            else prev.next = current;
            size--;
        }
    }
}

Iterator जाँच-सूची

कस्टम Iterator लागू करते समय:

  • next() से पहले हमेशा hasNext() को कॉल करें
  • खाली होने पर next() से null लौटाने के बजाय NoSuchElementException उत्पन्न करें
  • संग्रह के सापेक्ष इटरेटर को अवस्था-रहित रखें (संग्रह का आकार कैश न करें)
  • यदि आवश्यक हो, तो समवर्ती बदलाव का पता लगाने के लिए modCount का उपयोग करें

त्वरित जाँच

जब और कोई तत्व न हो, तो next() को क्या उत्पन्न करना चाहिए?

पुनरावलोकन: कस्टम Iterator लागू करना

मुख्य बातें:

  • hasNext(), next() और वैकल्पिक remove() के साथ Iterator<T> लागू करें
  • इटरेटर में एक स्थिति-सूचक फ़ील्ड रखें, जो अगले तत्व की ओर संकेत करे
  • जब hasNext() का परिणाम false हो, तो next() से NoSuchElementException उत्पन्न करें
  • स्वतंत्र स्थिति-सूचकों के लिए iterator() के प्रत्येक कॉल पर नया इटरेटर उदाहरण बनाएँ
  • विलंबित इटरेटर आवश्यकता पड़ने पर मान बनाते हैं — अनंत अनुक्रमों के लिए उपयोगी
  • Stream API से जोड़ने के लिए इटरेटर को StreamSupport.stream() में लपेटें
शुरुआत निःशुल्क

एआई शिक्षक के साथ Java सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
104
पाठ
374

अक्सर पूछे जाने वाले प्रश्न

क्या “Custom Iterator लागू करना” पाठ निःशुल्क है?

हाँ—“Custom Iterator लागू करना” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Java Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“Custom Iterator लागू करना” में मैं क्या सीखूँगा?

किसी सरल linked list या range structure के लिए custom iterator class बनाएँ। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Java Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Java Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Java Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।

“Custom Iterator लागू करना” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Java Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Java Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. Iterable और Iterator Contracts
  2. Custom Iterator लागू करना
  3. ListIterator और Bidirectional Traversal
  4. Fail-Fast बनाम Fail-Safe Iterators
← Java Academy पर वापस जाएँ