16_イテレータモード

1つ、コンテナとイテレータのインターフェイス

package com.study.iterator

/**
 * 集合接口
 */
interface Collection_ {
    
    
    /**
     * 添加元素
     */
    fun add(element: Any)

    /**
     * 当前版本的size
     */
    fun size(): Int



    /**
     * 获取当期容器的迭代器
     */
    fun getIteartor_():Iterator_
}
package com.study.iterator

/**
 * 迭代器模式
 */
interface Iterator_ {
    
    
    /**
     * 是否拥有下一个元素
     */
    fun hasNext(): Boolean

    /**
     * 下一个元素是什么
     */
    fun next(): Any
}

次に、コンテナ実装クラス

2.1配列

package com.study.iterator

import java.util.*

/**
 * 数组的集合
 */
class ArrayList_ : Collection_ {
    
    

    private var elements = Array<Any>(10) {
    
    }
    private var index = 0

    fun getIndex() = index

    fun getElements() = elements

    override fun add(element: Any) {
    
    
        if (index == elements.size) {
    
    
            elements = Arrays.copyOf(elements, elements.size * 2)
        }
        elements[index] = element
        index++
    }

    override fun size(): Int = index

    override fun getIteartor_(): Iterator_ = ArrayListIterator(this)
}

2.2リンクリスト

package com.study.iterator

/**
 * 链式存储
 */
class LinkedList_ : Collection_ {
    
    

    private var head: Node? = null
    private var tail: Node? = null
    private var size = 0

    /**
     * 获取头部
     */
    fun getHead() = head

    /**
     * 获取尾部
     */
    fun getTail() = tail

    /**
     * 集合存储数据大小
     */
    fun getSize() = size

    override fun add(element: Any) {
    
    
        var n = Node(element)
        n.next = null

        if (head == null) {
    
    
            head = n
            tail = n
        }
        tail?.next = n
        tail = n
        size++
    }

    override fun size(): Int = size

    override fun getIteartor_(): Iterator_ = LinkedListIterator(this)

    /**
     * o是当前节点存储的指
     * next指向下一个节点
     */
    inner class Node(var o: Any) {
    
    
        var next: Node? = null
    }
}

3、イテレータ実装クラス

3.1配列イテレータ

package com.study.iterator

class ArrayListIterator(val arrayList: ArrayList_) : Iterator_ {
    
    
    /**
     * 当前轮询的下标
     */
    var position = 0

    override fun hasNext(): Boolean = position < arrayList.getIndex()

    override fun next(): Any {
    
    
        var currentElement = arrayList.getElements()[position]
        position++
        return currentElement
    }
}

3.2リンクリストイテレータ

package com.study.iterator

class LinkedListIterator(val linkedList_: LinkedList_) : Iterator_ {
    
    
    /**
     * 当前轮询的下标
     */
    var currentNode = linkedList_.getHead()

    /**
     * 不等于空说明还有元素
     */
    override fun hasNext() = currentNode?.o != null


    override fun next(): Any {
    
    
        var value = currentNode?.o
        currentNode = currentNode?.next
        return value!!
    }
}

第四に、メインプログラムの呼び出し

package com.study.iterator

/**
 * 数据结构:
 * 物理结构:数组和链表
 * 逻辑结构:树、堆、队列、栈等都是基于数组或链表的逻辑结构
 *
 * 定义和类型
 * 定义:提供了一种方法,顺序访问一个集合对象中的各个元素,而又不暴露该对象的内部表示
类型:行为型
适用场景
访问一个集合对象的内容而无需暴露它的内部表示
为遍历不同的集合结构提供一个统一的接口
优点
分离了集合对象的遍历行为
缺点
类的个数成对增加
 */
fun main() {
    
    
    //数组
    var arrayList = ArrayList_()

    arrayList.add(4)
    arrayList.add(1)
    arrayList.add(2)
    arrayList.add(3)
    arrayList.add(5)

    val arrayListIteartor_ = arrayList.getIteartor_()
    while (arrayListIteartor_.hasNext()) {
    
    
        println(arrayListIteartor_.next())
    }

    println("============下面是链表=============")
    //链表
    val linkedList_ = LinkedList_()
    linkedList_.add(10)
    linkedList_.add(11)
    linkedList_.add(8)
    linkedList_.add(9)
    linkedList_.add(13)

    val linkeIteartor = linkedList_.getIteartor_()
    while (linkeIteartor.hasNext()) {
    
    
        println(linkeIteartor.next())
    }
}

5、運用結果

おすすめ

転載: blog.csdn.net/Duckdan/article/details/111191024