[7] [数据结构] ( 2 ) 迭代器 Iterator
总结
-
GOF定义?
提供一种方法顺序访问一个聚合对象中的各个元素,
而又不暴露(稳定)该对象的内部表示(隔离变化).
.
提供一种遍历集合元素的方法,
而不暴露集合的内部表示.
可以实现对集合的操作,
而不关心底层的实现细节.
-
为什么C++中不用OOP的方式实现迭代器? (STL)
虚函数调用有性能成本(运行时多态),
所以C++中实现迭代器的方式,
通常是使用模板(编译时多态).
-
迭代器的核心思想?
通过一个迭代器,隔离算法和容器.
-
解耦的是谁?
将集合对象的遍历方式和集合对象本身解耦,
当你需要添加新的遍历方式,
只需要创建新的迭代器,
不需要修改集合对象.
-
使用案例?
数据库结果查询的访问
.
文件系统的目录结构
.
社交网络中的消息列表
java例子1
package v25_iterator.java;
import java.util.ArrayList;
import java.util.Comparator;
interface Iterator {
boolean hasNext();
Object next();
}
class Book {
private String title;
public Book(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
}
class Bookshelf {
private ArrayList<Book> books;
public Bookshelf() {
books = new ArrayList<>();
}
public void addBook(Book book) {
books.add(book);
}
public Iterator iterator() {
return new BookIterator();
}
public Iterator sortedIterator() {
return new SortedBookIterator();
}
private class BookIterator implements Iterator {
int index;
public boolean hasNext() {
return index < books.size();
}
public Object next() {
if (this.hasNext()) {
return books.get(index++);
}
return null;
}
}
private class SortedBookIterator implements Iterator {
int index;
ArrayList<Book> sortedBooks;
public SortedBookIterator() {
sortedBooks = new ArrayList<>(books);
sortedBooks.sort(Comparator.comparing(Book::getTitle));
}
public boolean hasNext() {
return index < sortedBooks.size();
}
public Object next() {
if (this.hasNext()) {
return sortedBooks.get(index++);
}
return null;
}
}
}
public class Book3 {
public static void main(String[] args) {
Bookshelf bookshelf = new Bookshelf();
bookshelf.addBook(new Book("Book 1"));
bookshelf.addBook(new Book("Book 2"));
bookshelf.addBook(new Book("Book 3"));
Iterator iterator = bookshelf.sortedIterator();
while (iterator.hasNext()) {
Book book = (Book) iterator.next();
System.out.println(book.getTitle());
}
}
}


java例子2
package v25_iterator.java;
import java.util.ArrayList;
import java.util.List;
interface Iterator {
boolean hasNext();
Object next();
}
class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
class ClassroomIterator implements Iterator {
private Classroom classroom;
private int index;
public ClassroomIterator(Classroom classroom) {
this.classroom = classroom;
this.index = 0;
}
@Override
public boolean hasNext() {
return index < classroom.getSize();
}
@Override
public Object next() {
Student student = classroom.getStudentAt(index);
index++;
return student;
}
}
interface Aggregate {
Iterator createIterator();
}
class Classroom implements Aggregate {
private List<Student> students;
public Classroom() {
students = new ArrayList<>();
}
public void addStudent(Student student) {
students.add(student);
}
public Student getStudentAt(int index) {
return students.get(index);
}
public int getSize() {
return students.size();
}
@Override
public Iterator createIterator() {
return new ClassroomIterator(this);
}
}
public class StudentMain {
public static void main(String[] args) {
Classroom classroom = new Classroom();
classroom.addStudent(new Student("Alice", 20));
classroom.addStudent(new Student("Bob", 21));
classroom.addStudent(new Student("Charlie", 22));
Iterator iterator = classroom.createIterator();
while (iterator.hasNext()) {
Student student = (Student) iterator.next();
System.out.println(student.getName() + ": " + student.getAge());
}
}
}


浙公网安备 33010602011771号