我怎样才能改变这个使用“for循环”而不是`forEach`

我努力改变它使用for循环,仍然做同样的事情。

该程序应该读取一些航class的文件,该程序的特定部分需要使用用户输入的两个不同日期读取该文件,然后需要显示每个航class和每天有多少乘客。

而现在怎么做,但我试图改变它使用for循环,因为我之前说过,但不工作,因为我不知道如何做地图做同样的事情,但只在fun interval

 fun interval(reservas: List, dayInferior: Int, daySuperior: Int) { val map = mapReservas(reservas) for(day in dayInferior..daySuperior) { map.forEach { val reservasNum = it.key.first val reservasDay = it.key.second val reservasCount = it.value.count() if (reservasDay == day) { println("$reservasNum has $reservasCount passengers on day $day") } } } println() println("Press Enter") readLine() } fun mapReservas(reservas: List): Map<Pair, List> { val map = mutableMapOf<Pair, MutableList>() for (reserva in reservas) { val key = reserva.numFlight to reserva.day val list = map[key] ?: mutableListOf() list.add(reserva) map[key] = list } return map } 

所有的代码只能用一个函数来替换。

 fun interval(reservas: List, dayInferior: Int, daySuperior: Int) { reservas.groupBy { reserva -> reserva.day to reserva.numFlight } .filter { (key, _) -> key.first in dayInferior..daySuperior } .forEach { (key, reservas) -> val (reservasNum, reservasDay) = key val reservasCount = reservas.count() println("$reservasNum has $reservasCount passengers on day $reservasDay") } println() println("Press Enter") readLine() } 

解释:

  1. 当我不知情的时候,一开始你试图把你所有的Reservasday numFlight 。 它可以通过一个functiongroupBy来完成,在这里你可以通过一对daynumFlight
  2. 白天过滤所有Reservas 。 可以通过检查日期是否属于范围dayInferior..daySuperior (操作符)来完成。
  3. 使用forEach打印所有reservas。

其他事情

  1. 破坏声明

     val reservasNum = it.key.first val reservasDay = it.key.second same as val (reservasNum, reservasDa) = it.key 
  2. 在lamda中省略一个未使用的参数 :

     .filter { (key, _) -> ... } 

如果你迭代一个for循环遍历Map每个元素都是一个Pair 。 如果你写(pair, list)你会破坏每个Pair,它本身包含一个Pair和一个List

 fun interval(reservas: List, dayInferior: Int, daySuperior: Int) { val map = mapReservas(reservas) for(day in dayInferior..daySuperior) { for((pair, list) in map) { val reservasNum = pair.first val reservasDay = pair.second val reservasCount = list.count() // ... } } // ... } 

也许这更清楚:

 for(outerPair in map){ val (innerPair, list) = outerPair val reservasNum = innerPair.first val reservasDay = innerPair.second val reservasCount = list.count() // ... } 

mapReservas离开了这个函数( mapReservas ),因为也许你正在别的地方使用它。 但是你可以通过使用types别名 (Kotlin 1.1)来改善它。

 typealias FlightNum = String typealias Day = Int fun mapReservas(reservas: List): Map, List> { // ... } 

正如您所看到的,如果使用解构语法和types别名,代码将变得更加可读。