[11]數(shù)組&集合的遍歷

前言

上節(jié)我們講了集合Map相關(guān)知識(shí),大家感興趣的可參看以下文章
[1]Kotlin中的算數(shù)運(yùn)算
[2]二元運(yùn)算符 ?:
[3]Any的使用
[4]數(shù)組Array
[5]Predicate的使用
[6]字符串String
[7]集合List
[8]集合Set及優(yōu)化類(lèi)DataUtil,ArrayUtil
[9]集合List優(yōu)化
[10]集合Map
在日常開(kāi)發(fā)過(guò)程中,無(wú)論是數(shù)組還是集合我們經(jīng)常使用到遍歷,那么今天就讓我們來(lái)學(xué)習(xí)一下遍歷相關(guān)的知識(shí)吧。
今天涉及到的知識(shí)有:
1.通用遍歷方式
2.封裝遍歷類(lèi)IteratorUtil中方法介紹
3.IteratorUtilActivity中使用
4.IteratorUtil源碼

一. 通用遍歷方式

遍歷的通用方式有for循環(huán),while循環(huán),以及迭代器iterator。
一般它們的遍歷方式如下:

        var array = arrayOf("a", "b")

        LogUtil.i("===========數(shù)組遍歷==========")
        LogUtil.i("iterator遍歷數(shù)組:")
        var iterator: Iterator<String> = array.iterator()
        while (iterator.hasNext()) {
            var it = iterator.next()
            LogUtil.i("it=${it}")
//            iterator.remove()
        }

        LogUtil.i("")
        LogUtil.i("while遍歷數(shù)組:")
        var index = 0
        while (index < array.size) {
            var it = array[index]
            LogUtil.i("it=${it}")
            index++
        }

        LogUtil.i("")
        LogUtil.i("for-i遍歷數(shù)組:")
        for (i in 0 until array.count()) {
            var it = array[i]
            LogUtil.i("i=$i  it=$it")
        }

        LogUtil.i("")
        LogUtil.i("forIndices遍歷數(shù)組:")
        for (i in array.indices) {
            var it = array[i]
            LogUtil.i("i=$i  it=$it")
        }

        LogUtil.i("")
        LogUtil.i("forEach遍歷數(shù)組:")
        array.forEach {
            LogUtil.i("it=${it}")
        }

        LogUtil.i("")
        LogUtil.i("forEachIndex遍歷數(shù)組:")
        array.forEachIndexed { i, it ->
            LogUtil.i("i=$i  it=$it")
        }


        LogUtil.i("")
        LogUtil.i("===========map遍歷==========")
        var map: MutableMap<String, Int> = mutableMapOf(
            "a" to 1,
            "b" to 2
        )

        LogUtil.i("MutableEntry遍歷map:")
        for (it in map.entries) {
            LogUtil.i("it.key=${it.key}  it.value=${it.value}")
        }

        LogUtil.i("")
        LogUtil.i("遍歷map的key:")
        for (it in map.keys) {
            LogUtil.i("it.key=${it}  it.value=${map[it]}")
        }


        LogUtil.i("")
        LogUtil.i("遍歷map的value:")
        for (it in map.values) {
            LogUtil.i("it.value=${it}")
        }

輸出結(jié)果如下:

17:42:52.733  I  ========一般遍歷========
17:42:52.733  I  ===========數(shù)組遍歷==========
17:42:52.733  I  iterator遍歷數(shù)組:
17:42:52.733  I  it=a
17:42:52.733  I  it=b
17:42:52.733  I  
17:42:52.733  I  while遍歷數(shù)組:
17:42:52.733  I  it=a
17:42:52.733  I  it=b
17:42:52.733  I  
17:42:52.733  I  for-i遍歷數(shù)組:
17:42:52.733  I  i=0  it=a
17:42:52.734  I  i=1  it=b
17:42:52.734  I  
17:42:52.734  I  forIndices遍歷數(shù)組:
17:42:52.734  I  i=0  it=a
17:42:52.734  I  i=1  it=b
17:42:52.734  I  
17:42:52.734  I  forEach遍歷數(shù)組:
17:42:52.734  I  it=a
17:42:52.734  I  it=b
17:42:52.734  I  
17:42:52.734  I  forEachIndex遍歷數(shù)組:
17:42:52.734  I  i=0  it=a
17:42:52.734  I  i=1  it=b
17:42:52.734  I  
17:42:52.735  I  ===========map遍歷==========
17:42:52.735  I  MutableEntry遍歷map:
17:42:52.736  I  it.key=a  it.value=1
17:42:52.736  I  it.key=b  it.value=2
17:42:52.737  I  
17:42:52.737  I  遍歷map的key:
17:42:52.737  I  it.key=a  it.value=1
17:42:52.737  I  it.key=b  it.value=2
17:42:52.737  I  
17:42:52.737  I  遍歷map的value:
17:42:52.738  I  it.value=1
17:42:52.738  I  it.value=2

二. 封裝遍歷類(lèi) IteratorUtil 中方法介紹

為了使用方便,這里我將遍歷方法封裝到一個(gè)工具類(lèi)IteratorUtil中,其有以下方法:

    /***
     * Collection,map,數(shù)組迭代器遍歷
     *
     * @param t T
     * @param isReversed Boolean 是否倒序遍歷,默認(rèn)false。(map無(wú)序,不受此參數(shù)影響)
     * @param loop Function1<E, Unit>
     */
    fun <T, E> iterator(t: T, loop: (E) -> Unit, isReversed: Boolean = false) 


    /***
     * Collection,map,數(shù)組forEach遍歷
     *
     * @param t T
     * @param loop Function1<E, Unit>
     */
    fun <T, E> forEach(t: T, loop: (E) -> Unit)


    /***
     * Collection,數(shù)組forEachIndexed遍歷
     *
     * @param t T
     * @param loop Function2<Int, E, Unit>
     */
    fun <T, E> forEachIndexed(t: T, loop: (Int, E) -> Unit)

三. IteratorUtil 在 Activity 中使用

接下來(lái)讓我們看看IteratorUtilActivity中的使用:

package com.example.kdemo.ui.test

import android.os.Build
import android.os.Bundle
import android.view.View
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import com.example.kdemo.R
import com.example.kdemo.databinding.ActivityTestBinding
import com.example.kdemo.util.data.collection.IteratorUtil
import com.example.kdemo.util.log.LogUtil
import com.example.kdemo.util.toast.ToastUtil


class TestActivity : AppCompatActivity(), View.OnClickListener {

    private lateinit var mBinding: ActivityTestBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mBinding = ActivityTestBinding.inflate(layoutInflater)
        setContentView(mBinding.root)

        initData()
        setListener()
    }

    private fun initData() {}

    private fun setListener() {
        mBinding.mBtnTest.setOnClickListener(this)
    }

    @RequiresApi(Build.VERSION_CODES.Q)
    override fun onClick(view: View) {
        when (view.id) {
            R.id.mBtnTest -> {
                test()
            }

            else -> {

            }
        }
    }

    private fun test() {
        ToastUtil.showShortToast(this, "begin test")

        //list遍歷示例
        LogUtil.i("=========list遍歷示例:")
        var list = listOf("a", "b", "c")
        //迭代器遍歷
        IteratorUtil.iterator<Collection<String>,String>(list, {
            LogUtil.i("迭代器遍歷: list_item=$it")
        })
        //迭代器遍歷倒序遍歷
        IteratorUtil.iterator<Collection<String>,String>(list, {
            LogUtil.i("迭代器倒序遍歷: list_item=$it")
        },true)
        //forEach遍歷
        IteratorUtil.forEach<Collection<String>,String>(list,{
            LogUtil.i("forEach遍歷: list_item=$it")
        })
        //forEachIndexed遍歷
        IteratorUtil.forEachIndexed<Collection<String>, String>(list, { index, it ->
            LogUtil.i("forEachIndexed: list_index=$index   list_item=$it")
        })


        //set遍歷示例
        LogUtil.i("")
        LogUtil.i("=========set遍歷示例:")
        var set = setOf(1, 2, 3)
        //迭代器遍歷
        IteratorUtil.iterator<Collection<Int>,Int>(set, {
            LogUtil.i("迭代器遍歷: set_item=$it")
        })
        //迭代器遍歷倒序遍歷(set倒序遍歷無(wú)意義,因?yàn)閟et無(wú)序)
        IteratorUtil.iterator<Collection<Int>,Int>(set, {
            LogUtil.i("迭代器倒序遍歷(set倒序遍歷無(wú)意義,因?yàn)閟et無(wú)序): set_item=$it")
        },true)
        //forEach遍歷
        IteratorUtil.forEach<Collection<Int>,Int>(set,{
            LogUtil.i("forEach遍歷: set_item=$it")
        })
        //forEachIndexed遍歷
        IteratorUtil.forEachIndexed<Collection<Int>,Int>(set,{ index, it ->
            LogUtil.i("forEachIndexed遍歷: [set無(wú)序,下標(biāo)沒(méi)啥用]set_index=$index  set_item=$it")
        })



        //map遍歷示例
        LogUtil.i("")
        LogUtil.i("=========map遍歷示例:")
        var map = mapOf("a" to 1,"b" to 2)
        //迭代器遍歷
        IteratorUtil.iterator<Map<String,Int>,Map.Entry<String,Int>>(map, {
            LogUtil.i("迭代器遍歷: map_key=${it.key}  map_value=${it.value}")
        })
        //map無(wú)序,無(wú)倒序遍歷
        //forEach遍歷
        IteratorUtil.forEach<Map<String,Int>,Map.Entry<String,Int>>(map,{
            LogUtil.i("forEach遍歷: map_key=${it.key}  map_value=${it.value}")
        })
        //forEachIndexed遍歷
        //注:Map無(wú)序,因此無(wú)下標(biāo),不能用forEachIndexed遍歷



        //數(shù)組Array遍歷示例
        LogUtil.i("")
        LogUtil.i("=========數(shù)組Array遍歷示例:")
        var arrays = arrayOf(true, false,null)
        //迭代器遍歷
        IteratorUtil.iterator<Array<Boolean?>, Boolean?>(arrays, {
            LogUtil.i("迭代器遍歷: arrays_item=${it}")
        })
        //迭代器倒序遍歷
        IteratorUtil.iterator<Array<Boolean?>,Boolean?>(arrays, {
            LogUtil.i("迭代器倒序遍歷: arrays_item=${it}")
        },true)
        //forEach遍歷
        IteratorUtil.forEach<Array<Boolean?>,Boolean?>(arrays,{
            LogUtil.i("forEach遍歷: arrays_item=${it}")
        })
        //forEachIndexed遍歷
        IteratorUtil.forEachIndexed<Array<Boolean?>,Boolean?>(arrays,{ index, it ->
            LogUtil.i("forEachIndexed遍歷: arrays_indx=$index  arrays_item=${it}")
        })


        LogUtil.i("")
        LogUtil.i("")
        LogUtil.i("========一般遍歷========")
        normalForEach()
    }


    private fun normalForEach() {
        var array = arrayOf("a", "b")

        LogUtil.i("===========數(shù)組遍歷==========")
        LogUtil.i("iterator遍歷數(shù)組:")
        var iterator: Iterator<String> = array.iterator()
        while (iterator.hasNext()) {
            var it = iterator.next()
            LogUtil.i("it=${it}")
//            iterator.remove()
        }

        LogUtil.i("")
        LogUtil.i("while遍歷數(shù)組:")
        var index = 0
        while (index < array.size) {
            var it = array[index]
            LogUtil.i("it=${it}")
            index++
        }

        LogUtil.i("")
        LogUtil.i("for-i遍歷數(shù)組:")
        for (i in 0 until array.count()) {
            var it = array[i]
            LogUtil.i("i=$i  it=$it")
        }

        LogUtil.i("")
        LogUtil.i("forIndices遍歷數(shù)組:")
        for (i in array.indices) {
            var it = array[i]
            LogUtil.i("i=$i  it=$it")
        }

        LogUtil.i("")
        LogUtil.i("forEach遍歷數(shù)組:")
        array.forEach {
            LogUtil.i("it=${it}")
        }

        LogUtil.i("")
        LogUtil.i("forEachIndex遍歷數(shù)組:")
        array.forEachIndexed { i, it ->
            LogUtil.i("i=$i  it=$it")
        }


        LogUtil.i("")
        LogUtil.i("===========map遍歷==========")
        var map: MutableMap<String, Int> = mutableMapOf(
            "a" to 1,
            "b" to 2
        )

        LogUtil.i("MutableEntry遍歷map:")
        for (it in map.entries) {
            LogUtil.i("it.key=${it.key}  it.value=${it.value}")
        }

        LogUtil.i("")
        LogUtil.i("遍歷map的key:")
        for (it in map.keys) {
            LogUtil.i("it.key=${it}  it.value=${map[it]}")
        }


        LogUtil.i("")
        LogUtil.i("遍歷map的value:")
        for (it in map.values) {
            LogUtil.i("it.value=${it}")
        }

    }


}

運(yùn)行結(jié)果如下:

17:42:52.634  I  =========list遍歷示例:
17:42:52.637  I  迭代器遍歷: list_item=a
17:42:52.637  I  迭代器遍歷: list_item=b
17:42:52.637  I  迭代器遍歷: list_item=c
17:42:52.649  I  迭代器倒序遍歷: list_item=c
17:42:52.649  I  迭代器倒序遍歷: list_item=b
17:42:52.649  I  迭代器倒序遍歷: list_item=a
17:42:52.650  I  forEach遍歷: list_item=a
17:42:52.650  I  forEach遍歷: list_item=b
17:42:52.650  I  forEach遍歷: list_item=c
17:42:52.651  I  forEachIndexed: list_index=0   list_item=a
17:42:52.651  I  forEachIndexed: list_index=1   list_item=b
17:42:52.651  I  forEachIndexed: list_index=2   list_item=c
17:42:52.651  I  
17:42:52.651  I  =========set遍歷示例:
17:42:52.723  I  迭代器遍歷: set_item=1
17:42:52.723  I  迭代器遍歷: set_item=2
17:42:52.723  I  迭代器遍歷: set_item=3
17:42:52.723  I  迭代器倒序遍歷(set倒序遍歷無(wú)意義,因?yàn)閟et無(wú)序): set_item=3
17:42:52.724  I  迭代器倒序遍歷(set倒序遍歷無(wú)意義,因?yàn)閟et無(wú)序): set_item=2
17:42:52.724  I  迭代器倒序遍歷(set倒序遍歷無(wú)意義,因?yàn)閟et無(wú)序): set_item=1
17:42:52.725  I  forEach遍歷: set_item=1
17:42:52.725  I  forEach遍歷: set_item=2
17:42:52.725  I  forEach遍歷: set_item=3
17:42:52.726  I  forEachIndexed遍歷: [set無(wú)序,下標(biāo)沒(méi)啥用]set_index=0  set_item=1
17:42:52.726  I  forEachIndexed遍歷: [set無(wú)序,下標(biāo)沒(méi)啥用]set_index=1  set_item=2
17:42:52.726  I  forEachIndexed遍歷: [set無(wú)序,下標(biāo)沒(méi)啥用]set_index=2  set_item=3
17:42:52.726  I  
17:42:52.726  I  =========map遍歷示例:
17:42:52.727  I  迭代器遍歷: map_key=a  map_value=1
17:42:52.727  I  迭代器遍歷: map_key=b  map_value=2
17:42:52.727  I  forEach遍歷: map_key=a  map_value=1
17:42:52.727  I  forEach遍歷: map_key=b  map_value=2
17:42:52.727  I  
17:42:52.727  I  =========數(shù)組Array遍歷示例:
17:42:52.730  I  迭代器遍歷: arrays_item=true
17:42:52.731  I  迭代器遍歷: arrays_item=false
17:42:52.731  I  迭代器遍歷: arrays_item=null
17:42:52.731  I  迭代器倒序遍歷: arrays_item=null
17:42:52.731  I  迭代器倒序遍歷: arrays_item=false
17:42:52.731  I  迭代器倒序遍歷: arrays_item=true
17:42:52.732  I  forEach遍歷: arrays_item=true
17:42:52.732  I  forEach遍歷: arrays_item=false
17:42:52.732  I  forEach遍歷: arrays_item=null
17:42:52.732  I  forEachIndexed遍歷: arrays_indx=0  arrays_item=true
17:42:52.732  I  forEachIndexed遍歷: arrays_indx=1  arrays_item=false
17:42:52.732  I  forEachIndexed遍歷: arrays_indx=2  arrays_item=null
17:42:52.733  I  
17:42:52.733  I  
17:42:52.733  I  ========一般遍歷========
17:42:52.733  I  ===========數(shù)組遍歷==========
17:42:52.733  I  iterator遍歷數(shù)組:
17:42:52.733  I  it=a
17:42:52.733  I  it=b
17:42:52.733  I  
17:42:52.733  I  while遍歷數(shù)組:
17:42:52.733  I  it=a
17:42:52.733  I  it=b
17:42:52.733  I  
17:42:52.733  I  for-i遍歷數(shù)組:
17:42:52.733  I  i=0  it=a
17:42:52.734  I  i=1  it=b
17:42:52.734  I  
17:42:52.734  I  forIndices遍歷數(shù)組:
17:42:52.734  I  i=0  it=a
17:42:52.734  I  i=1  it=b
17:42:52.734  I  
17:42:52.734  I  forEach遍歷數(shù)組:
17:42:52.734  I  it=a
17:42:52.734  I  it=b
17:42:52.734  I  
17:42:52.734  I  forEachIndex遍歷數(shù)組:
17:42:52.734  I  i=0  it=a
17:42:52.734  I  i=1  it=b
17:42:52.734  I  
17:42:52.735  I  ===========map遍歷==========
17:42:52.735  I  MutableEntry遍歷map:
17:42:52.736  I  it.key=a  it.value=1
17:42:52.736  I  it.key=b  it.value=2
17:42:52.737  I  
17:42:52.737  I  遍歷map的key:
17:42:52.737  I  it.key=a  it.value=1
17:42:52.737  I  it.key=b  it.value=2
17:42:52.737  I  
17:42:52.737  I  遍歷map的value:
17:42:52.738  I  it.value=1
17:42:52.738  I  it.value=2

四. IteratorUtil 源碼

接下來(lái)給出IteratorUtil源碼:

還有 17% 的精彩內(nèi)容
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
支付 ¥3.76 繼續(xù)閱讀

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容