0Pricing
Java Academy · Ders

Özel Bir Iterator Uygulama

Basit bir bağlı liste veya aralık yapısı için özel bir yineleyici sınıfı oluşturun.

Özel Bir Iterator Uygulama, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.

Özel Iterator

Özel bir Iterator oluşturmak, bir veri yapısında nasıl gezinileceği üzerinde tam denetim sağlar. Bu derste bağlı liste Iterator'ının nasıl uygulanacağı adım adım anlatılmaktadır.

Node Sınıfı

Öncelikle tek yönlü bağlı listenin düğüm yapısını tanımlayın.

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'ı Uygulama

Geçerli düğümü gösteren bir imleçle Iterator<T> uygulayan bir iç sınıf oluşturun.

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 ve Eksiksiz LinkedList

Düğümleri listenin başına ekleme özelliğini ekleyin ve tamamen çalışan sınıfı görün.

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();
    }
}

Özel Iterator'ı Kullanma

Iterable arayüzü uygulandığında bağlı liste, for-each döngülerinde ve forEach ile çalışır.

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));

Aralık Iterator'ı

Daha basit bir örnek: destekleyici bir veri yapısı olmadan sayısal bir aralık üzerinde çalışan bir 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

Ağaçta Sıralı Gezinme Iterator'ı

Açık bir yığın kullanarak sıralı BST Iterator'ı uygulamak, Iterator'ların özyinelemeli gezinmenin yerine nasıl geçebileceğini gösterir.

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(); }
    }
}

Tembel Iterator

Iterator'lar değerleri tembel biçimde, yalnızca next() çağrıldığında üretebilir. Bu, sonsuz diziler için kullanışlıdır.

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

Süzgeçli Iterator

Başka bir Iterator'ı saran ve bir koşula uymayan öğeleri atlayan dekoratör 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 ve Akış Bütünleştirmesi

Özel Iterator'lar, Spliterators.spliteratorUnknownSize() kullanılarak akışlara uyarlanabilir.

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

Ge gezinme Sırasında Kaldırma

Iterator üzerindeki isteğe bağlı remove() yöntemi, son next() çağrısının döndürdüğü öğeyi kaldırır; özel Iterator'larda bu yöntem açıkça uygulanmalıdır.

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 Kontrol Listesi

Özel bir Iterator uygularken:

  • next() çağırmadan önce her zaman hasNext() çağırın
  • Koleksiyon boş olduğunda next() içinden null döndürmek yerine NoSuchElementException oluşturun
  • Iterator'ı koleksiyona göre durum bilgisiz tutun (koleksiyonun boyutunu önbelleğe almayın)
  • Gerekirse eş zamanlı değişikliği algılamak için modCount kullanın

Hızlı Kontrol

Daha fazla öğe kalmadığında next() ne oluşturmalıdır?

Özet: Özel Iterator Uygulama

Temel çıkarımlar:

  • hasNext(), next() ve isteğe bağlı remove() yöntemleriyle Iterator<T> uygulayın
  • Iterator içinde bir sonraki öğeyi gösteren bir imleç alanı tutun
  • hasNext() false olduğunda next() içinden NoSuchElementException oluşturun
  • Bağımsız imleçler elde etmek için iterator() çağrılarının her biri için yeni bir Iterator örneği oluşturun
  • Tembel Iterator'lar değerleri gerektiğinde üretir; sonsuz diziler için kullanışlıdır
  • Iterator'ları Stream API'sine bağlamak için StreamSupport.stream() ile sarın

Sıkça Sorulan Sorular

“Özel Bir Iterator Uygulama” dersi ücretsiz mi?

Evet — “Özel Bir Iterator Uygulama” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.

“Özel Bir Iterator Uygulama” dersinde ne öğreneceğim?

Basit bir bağlı liste veya aralık yapısı için özel bir yineleyici sınıfı oluşturun. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Java Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“Özel Bir Iterator Uygulama” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Iterable ve Iterator Sözleşmeleri
  2. Özel Bir Iterator Uygulama
  3. ListIterator ve Çift Yönlü Gezinme
  4. Fail-Fast ve Fail-Safe Yineleyiciler
← Java Academy Sayfasına Dön