前言
上節(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.IteratorUtil在Activity中使用
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)讓我們看看IteratorUtil在Activity中的使用:
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源碼: