这是Kotlin访谈的第四部分,我在这个系列中回顾了Kotlin函数和代码片段,这些都是我在准备Android面试时经常出现的。我还编写了一份小抄,涵盖了本系列的全部5个部分,你可以在这里找到。
许多面试问题都需要某种迭代,无论是操作输入数组还是使用映射来存储信息,因此我将介绍一些常见数据结构的不同迭代方式。
Kotlin中的范围是由起始值、终止值和步长定义的一系列值。步长(即两个值之间的距离)的缺省值为1。您最常遇到的步长是IntRange,但您也可以使用long grange和CharRange。
ForEach()对集合中的每个元素执行给定的操作。这是我在普通项目中最常用的迭代方法,但在访谈中使用的频率不高,因为1)如果在迭代访问集合时试图修改集合,forEach()将抛出ConcurrentModificationException异常;2)很多面试问题也需要考虑索引。
ForEachIndexed()与forEach()类似,不同之处在于您还可以访问lambda中的元素索引,这是面试问题中经常需要的。
//以偶数索引打印元素。List.forEachIndexed{index,Element->;if(index%2==0)println(";$Element";)}。
..,也称为rangeTo(),可以以for(a..b中的i)的形式使用来创建然后迭代范围。该范围将包括start(A)和end(B)元素,因此如果您希望使用它来迭代列表/数组,则应该将其写为for(i in 0..list.size-1)或使用Until。尽管它最常与Int一起使用,但您也可以迭代字符。
//从i=0到i=100迭代打印(i in 0..100){println(I)}//从i=0迭代到i=list.size-1 for(i in 0..list.size-1){println(list[i])}//迭代并打印';a';,';b';,';c';,';d';for(i in';d';for(i in。..){println(I)}
DownTo()的工作方式与..类似,不同之处在于每次迭代都向下一步而不是向上一步。
//从i=100到i=0迭代打印(i in 100向下到0){println(I)}。
//(i in 1..8 step 2){println(I)}迭代打印1,3,5,7 for(I In 8 Down To 1 Step 3){println(I)}。
Until()包括开始元素,但不包括结束元素。这是我首选的遍历集合索引的方式,因为如果使用列表的大小作为结尾,就不必担心索引超出界限。
//从i=0到i=99迭代打印(i in 0到100){println(I)}//迭代并打印元素从i=0到i=list.size-1 for(i in 0到list.size){println(list[i])}。
INDEX返回表示集合的有效索引的IntRange,其使用方法与Until()类似。
Val list=listof(';a';,';b';,';c';)println(list.index)//打印0..2//迭代并打印(i in list.index){println(List[i])}中i=0到i=2的元素。
这在实际项目中并不常见,但在面试问题中却经常出现--网格、迷宫、图表等等都可以用2D数组来表示。
以下是我使用Until迭代二维数组或列表的首选方法:
If(grid.isEmpty())return for(i in 0 to grid.size){for(j in 0 in 0 to grid[0].size){println(grid[i][j])}}。
If(grid.isEmpty())return for(i in grid.index){for(j in 0,直至Grid[0].size){println(grid[i][j])}}。
地图在面试问题中也很常见,特别是当列表不够时,地图是存储信息的好方法。
如果需要遍历键-值对,可以使用for循环或forEach循环。这取决于个人喜好。
//使用for循环for((key,value)in map){println(";$key=$value";)}//使用forEach()map.forEach{(key,value)->;println(";$key=$value";)}迭代条目。
如果只需要遍历这些键,则可以使用键val来获取映射中的一组所有键,并遍历这些键。
同样,如果只需要遍历这些值,值val将返回一组映射中的所有值。
当您希望根据元素的优先级处理元素时,PriorityQueue非常有用。它们经常用在要求第K个最大值、第K个最小值、最大K个频率等面试问题中。我在第1部分中更详细地讨论了这些问题,但这里提醒您迭代遍历是什么样子的。
Val pq=PriorityQueue<;Int>;(listof(2,1,3))//pq将在3次迭代后为空,而(pq.isNotEmpty()){println(pq.pol())//打印1,然后打印2,然后打印3}。
第4部分到此为止!这里的链接再次涵盖了所有5个部分的小抄。