美文网首页
[11]数组&集合的遍历

[11]数组&集合的遍历

作者: 奔跑的佩恩 | 来源:发表于2025-04-30 17:51 被阅读0次

前言

上节我们讲了集合Map相关知识,大家感兴趣的可参看以下文章
[1]Kotlin中的算数运算
[2]二元运算符 ?:
[3]Any的使用
[4]数组Array
[5]Predicate的使用
[6]字符串String
[7]集合List
[8]集合Set及优化类DataUtil,ArrayUtil
[9]集合List优化
[10]集合Map
在日常开发过程中,无论是数组还是集合我们经常使用到遍历,那么今天就让我们来学习一下遍历相关的知识吧。
今天涉及到的知识有:
1.通用遍历方式
2.封装遍历类IteratorUtil中方法介绍
3.IteratorUtilActivity中使用
4.IteratorUtil源码

一. 通用遍历方式

遍历的通用方式有for循环,while循环,以及迭代器iterator
一般它们的遍历方式如下:

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

        LogUtil.i("===========数组遍历==========")
        LogUtil.i("iterator遍历数组:")
        var iterator: Iterator<String> = array.iterator()
        while (iterator.hasNext()) {
            var it = iterator.next()
            LogUtil.i("it=${it}")
//            iterator.remove()
        }

        LogUtil.i("")
        LogUtil.i("while遍历数组:")
        var index = 0
        while (index < array.size) {
            var it = array[index]
            LogUtil.i("it=${it}")
            index++
        }

        LogUtil.i("")
        LogUtil.i("for-i遍历数组:")
        for (i in 0 until array.count()) {
            var it = array[i]
            LogUtil.i("i=$i  it=$it")
        }

        LogUtil.i("")
        LogUtil.i("forIndices遍历数组:")
        for (i in array.indices) {
            var it = array[i]
            LogUtil.i("i=$i  it=$it")
        }

        LogUtil.i("")
        LogUtil.i("forEach遍历数组:")
        array.forEach {
            LogUtil.i("it=${it}")
        }

        LogUtil.i("")
        LogUtil.i("forEachIndex遍历数组:")
        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}")
        }

输出结果如下:

17:42:52.733  I  ========一般遍历========
17:42:52.733  I  ===========数组遍历==========
17:42:52.733  I  iterator遍历数组:
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遍历数组:
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遍历数组:
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遍历数组:
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遍历数组:
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遍历数组:
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 中方法介绍

为了使用方便,这里我将遍历方法封装到一个工具类IteratorUtil中,其有以下方法:

    /***
     * Collection,map,数组迭代器遍历
     *
     * @param t T
     * @param isReversed Boolean 是否倒序遍历,默认false。(map无序,不受此参数影响)
     * @param loop Function1<E, Unit>
     */
    fun <T, E> iterator(t: T, loop: (E) -> Unit, isReversed: Boolean = false) 


    /***
     * Collection,map,数组forEach遍历
     *
     * @param t T
     * @param loop Function1<E, Unit>
     */
    fun <T, E> forEach(t: T, loop: (E) -> Unit)


    /***
     * Collection,数组forEachIndexed遍历
     *
     * @param t T
     * @param loop Function2<Int, E, Unit>
     */
    fun <T, E> forEachIndexed(t: T, loop: (Int, E) -> Unit)

三. IteratorUtil 在 Activity 中使用

接下来让我们看看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倒序遍历无意义,因为set无序)
        IteratorUtil.iterator<Collection<Int>,Int>(set, {
            LogUtil.i("迭代器倒序遍历(set倒序遍历无意义,因为set无序): 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无序,下标没啥用]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无序,无倒序遍历
        //forEach遍历
        IteratorUtil.forEach<Map<String,Int>,Map.Entry<String,Int>>(map,{
            LogUtil.i("forEach遍历: map_key=${it.key}  map_value=${it.value}")
        })
        //forEachIndexed遍历
        //注:Map无序,因此无下标,不能用forEachIndexed遍历



        //数组Array遍历示例
        LogUtil.i("")
        LogUtil.i("=========数组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("===========数组遍历==========")
        LogUtil.i("iterator遍历数组:")
        var iterator: Iterator<String> = array.iterator()
        while (iterator.hasNext()) {
            var it = iterator.next()
            LogUtil.i("it=${it}")
//            iterator.remove()
        }

        LogUtil.i("")
        LogUtil.i("while遍历数组:")
        var index = 0
        while (index < array.size) {
            var it = array[index]
            LogUtil.i("it=${it}")
            index++
        }

        LogUtil.i("")
        LogUtil.i("for-i遍历数组:")
        for (i in 0 until array.count()) {
            var it = array[i]
            LogUtil.i("i=$i  it=$it")
        }

        LogUtil.i("")
        LogUtil.i("forIndices遍历数组:")
        for (i in array.indices) {
            var it = array[i]
            LogUtil.i("i=$i  it=$it")
        }

        LogUtil.i("")
        LogUtil.i("forEach遍历数组:")
        array.forEach {
            LogUtil.i("it=${it}")
        }

        LogUtil.i("")
        LogUtil.i("forEachIndex遍历数组:")
        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}")
        }

    }


}

运行结果如下:

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倒序遍历无意义,因为set无序): set_item=3
17:42:52.724  I  迭代器倒序遍历(set倒序遍历无意义,因为set无序): set_item=2
17:42:52.724  I  迭代器倒序遍历(set倒序遍历无意义,因为set无序): 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无序,下标没啥用]set_index=0  set_item=1
17:42:52.726  I  forEachIndexed遍历: [set无序,下标没啥用]set_index=1  set_item=2
17:42:52.726  I  forEachIndexed遍历: [set无序,下标没啥用]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  =========数组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  ===========数组遍历==========
17:42:52.733  I  iterator遍历数组:
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遍历数组:
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遍历数组:
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遍历数组:
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遍历数组:
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遍历数组:
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 源码

接下来给出IteratorUtil源码:

相关文章

  • 2020-06-28增强for循环

    简化数组和Collection集合的遍历 格式:

  • 高级for循环

    高级for循环 格式:for(数据类型 变量名:被遍历的集合(Collection)或者数组){}对集合进行遍历。...

  • Java 增强for循环

    高级for循环 格式:for(数据类型 变量名:被遍历的集合(Collection)或者数组){ }对集合进行遍历...

  • Iterator迭代器

    要求:通过两种方式遍历集合中的元素 1.toArray();可以把集合装换成数组,遍历数组即可; 2.iterat...

  • Java集合(一)

    1.引用数据类型数组 2.集合和数组的区别 3. Collection接口的学习 4. 集合的遍历之集合转数组遍...

  • OC 基础 集合遍历和数组排序

    A ------ >遍历概念 1、集合 ( collection ) OC 中提供的容器 : 数组,字典,集合 2...

  • Swift学习之数组、集合和字典

    [toc] 数组 初始化一个数组 增加数组元素 读取数组元素 修改数组元素 删除数组元素 数组遍历 集合 集合类型...

  • Swift 基本语法(四)— 集合类型

    集合 数组 字典 数组 ** 数组遍历方式:for in, 和 forEach; forEach有两个特征:1...

  • JAVA基础(五)

    集合的由来? 集合和数组的区别? Collection集合的功能概述? Collection集合存储字符串并遍历?...

  • List集合系列文章(八) - 增强for

    1. 增强for特点 1>:简化了数组和Collection集合的遍历;2>:使用前需要判断数组或者集合是...

网友评论

      本文标题:[11]数组&集合的遍历

      本文链接:https://www.haomeiwen.com/subject/vtbfijtx.html