自定义TreeSet类,可以通过实现Iterator接口来编写迭代器。下面是一个示例代码:
import java.util.Iterator;
import java.util.NoSuchElementException;
public class CustomTreeSet<T> implements Iterable<T> {
private Node<T> root;
private int size;
private static class Node<T> {
private T value;
private Node<T> left;
private Node<T> right;
public Node(T value) {
this.value = value;
this.left = null;
this.right = null;
}
}
public CustomTreeSet() {
this.root = null;
this.size = 0;
}
public void add(T value) {
if (contains(value)) {
return;
}
root = addRecursive(root, value);
size++;
}
private Node<T> addRecursive(Node<T> current, T value) {
if (current == null) {
return new Node<>(value);
}
if (value.compareTo(current.value) < 0) {
current.left = addRecursive(current.left, value);
} else {
current.right = addRecursive(current.right, value);
}
return current;
}
public boolean contains(T value) {
return containsRecursive(root, value);
}
private boolean containsRecursive(Node<T> current, T value) {
if (current == null) {
return false;
}
if (value.compareTo(current.value) == 0) {
return true;
}
if (value.compareTo(current.value) < 0) {
return containsRecursive(current.left, value);
} else {
return containsRecursive(current.right, value);
}
}
public int size() {
return size;
}
@Override
public Iterator<T> iterator() {
return new TreeSetIterator();
}
private class TreeSetIterator implements Iterator<T> {
private Node<T> nextNode;
public TreeSetIterator() {
nextNode = findMinimum(root);
}
private Node<T> findMinimum(Node<T> node) {
if (node == null) {
return null;
}
while (node.left != null) {
node = node.left;
}
return node;
}
@Override
public boolean hasNext() {
return nextNode != null;
}
@Override
public T next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
Node<T> current = nextNode;
nextNode = findSuccessor(nextNode);
return current.value;
}
private Node<T> findSuccessor(Node<T> node) {
if (node.right != null) {
return findMinimum(node.right);
}
Node<T> successor = null;
Node<T> ancestor = root;
while (ancestor != node) {
if (node.value.compareTo(ancestor.value) < 0) {
successor = ancestor;
ancestor = ancestor.left;
} else {
ancestor = ancestor.right;
}
}
return successor;
}
}
}
这个示例代码实现了一个自定义的TreeSet类,包含了添加元素、判断元素是否存在、获取集合大小等基本功能。同时,它还实现了Iterable接口,通过实现Iterator接口来提供迭代器功能。
使用示例代码中的CustomTreeSet类,可以按照以下步骤编写迭代器:
这样,就可以使用foreach循环或者显式调用迭代器的hasNext()和next()方法来遍历自定义的TreeSet类了。
注意:以上示例代码仅为演示迭代器的实现方式,并不包含完整的错误处理和线程安全性。在实际开发中,可能需要根据具体需求进行适当的修改和优化。