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





image




image




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





image




image




posted @ 2023-12-04 21:07  qwertzxc  阅读(4)  评论(0)    收藏  举报