Ö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 8Ağ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 34Sü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 10Iterator 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); // 15Ge 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 zamanhasNext()çağırın- Koleksiyon boş olduğunda
next()içinden null döndürmek yerineNoSuchElementExceptionoluş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
- Iterable ve Iterator Sözleşmeleri
- Özel Bir Iterator Uygulama
- ListIterator ve Çift Yönlü Gezinme
- Fail-Fast ve Fail-Safe Yineleyiciler