NOTE

6.25 迭代器

1. 定义 提供一种遍历聚合对象的方式,JDK已经封装 2. Java 2.1. client 2.2. 迭代器 3. Golang 3.1. 迭代器 3.2. client

Software Architecture & Engineering约 1 分钟读完historical

这是历史学习笔记,可能存在过时或不完整的理解。

1. 定义

提供一种遍历聚合对象的方式,JDK已经封装

2. Java

2.1. client

public class Client
{
    public static void main(String[] args)
    {
        List<String> list = Arrays.asList(new String[]{"a","b","c"});


        MyIterrator<String> iterrator = new StringIterator(list);
        while (iterrator.hasNext())
        {
            String current = iterrator.getCurrent();
            System.out.println(current);
            System.out.println(iterrator.isLast());
            iterrator.next();
        }
    }
}

2.2. 迭代器

public interface MyIterrator <T>
{
    void first();
    void next();
    boolean hasNext();
    boolean isFirst();
    boolean isLast();
    T getCurrent();
}
public class StringIterator<T> implements MyIterrator<T>
{
    private int cursor = 0;
    private List<T> list = new ArrayList<>();

    public StringIterator(List<T> list)
    {
        this.list = list;
    }

    @Override
    public void first()
    {
        this.cursor = 0;
    }

    @Override
    public void next()
    {
        if (cursor == list.size())
            throw new RuntimeException("越界错误");
        cursor++;

    }

    @Override
    public boolean hasNext()
    {
        return cursor < list.size();
    }

    @Override
    public boolean isFirst()
    {
        return cursor == 0;
    }

    @Override
    public boolean isLast()
    {
        return cursor == list.size()-1;
    }

    @Override
    public T getCurrent()
    {
        return this.list.get(cursor);
    }
}

3. Golang

3.1. 迭代器


/*聚合对象的接口*/
type Aggregate interface {
	//返回迭代器
	Iterator() Iterator
}

/*聚合对象的迭代器*/
type Iterator interface {
	First()
	IsDone() bool
	Next() interface{}
}

/*聚合对象: Numbers*/
type Numbers struct {
	start, end int
}

func (n *Numbers) Iterator() Iterator {
	return &NumbersIterator{
		numbers: n,
		next:    n.start,
	}
}

func NewNumbers(start int, end int) *Numbers {
	return &Numbers{start: start, end: end}
}

/*Numbers的迭代器*/

type NumbersIterator struct {
	numbers *Numbers
	next    int
}

func (n *NumbersIterator) First() {
	n.next = n.numbers.start
}

func (n *NumbersIterator) IsDone() bool {
	return n.next > n.numbers.end
}

func (n *NumbersIterator) Next() interface{} {
	if !n.IsDone() {
		next := n.next
		n.next++
		return next
	}
	return nil
}

func IteratorPrint(i Iterator) {
	for i.First(); !i.IsDone(); {
		c := i.Next()
		fmt.Printf("%#v\n", c)
	}
}

3.2. client

func main() {
	numbers := 迭代器.NewNumbers(1, 10)
	迭代器.IteratorPrint(numbers.Iterator())
}

讨论

使用 GitHub 账号参与讨论,评论会保存在 GitHub Issues 中。在 GitHub 查看