Kotlin 我如何将此更改为“使用”;for loop";而不是“forEach”`

Kotlin 我如何将此更改为“使用”;for loop";而不是“forEach”`,kotlin,Kotlin,我正在努力将其更改为使用for循环,并且仍然执行相同的操作 程序应该读取一些航班的文件,程序的这一特定部分需要使用用户输入的两个不同日期读取文件,然后需要显示每个航班和每天有多少乘客 现在它是如何工作的,但我正试图将其更改为使用for循环,正如我之前所说的,但不起作用,因为我不知道如何做与map相同的事情,但只是在有趣的时间间隔中 fun interval(reservas: List<Reservas>, dayInferior: Int, daySuperior: Int) {

我正在努力将其更改为使用for循环,并且仍然执行相同的操作

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

现在它是如何工作的,但我正试图将其更改为使用for循环,正如我之前所说的,但不起作用,因为我不知道如何做与map相同的事情,但只是在
有趣的时间间隔中

fun interval(reservas: List<Reservas>, 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<Reservas>): Map<Pair<String, Int>, List<Reservas>> {
    val map = mutableMapOf<Pair<String, Int>, MutableList<Reservas>>()
    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(预订:列表,daySuperior:Int,daySuperior:Int){
val map=mapReservas(保留)
用于(每日下级..每日上级){
弗雷奇地图{
val reservasNum=it.key.first
val reservasDay=it.key.second
val reservasCount=it.value.count()
如果(预订日==天){
println($reservasNum在第天$day有$RESERVASCONT乘客)
}
}
}
println()
println(“按回车键”)
readLine()
}
趣味地图保留(保留:列表):地图{
val map=mutableMapOf()
for(保留中的保留){
val key=reserva.numFlight to reserva.day
val list=map[key]?:mutableListOf()
列表。添加(保留)
映射[键]=列表
}
返回图
}

如果在
映射上使用for循环进行迭代
则每个元素都是
。如果您编写
(pair,list)
则会对每个pair进行解构,它们本身由
pair
list
组成

fun interval(reservas: List<Reservas>, 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()
            // ...
        }
    }
    // ...
}
我故意不去碰这个函数(
mapReservas
),因为您可能正在其他地方使用它。但是您可以通过使用(自Kotlin 1.1)立即改进它

typealias FlightNum=String
typealias Day=Int
趣味地图预订(预订:列表):
地图{
// ...
}

如您所见,如果使用destructure语法和类型别名,代码的可读性将大大提高。

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

fun interval(reservas: List<Reservas>, 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()
}
  • :


  • 看看“谷歌”用户的答案。这将是在Kotlin(或带有流的Java)中实现的方法。有趣的mapReservas可以使用“groupBy”完成,所以为什么要自己编写呢。您的“for(day in daySuperior..daySuperior)”可以通过过滤器完成。绝对值得一看,值得选择答案。是的,我在选择答案时犯了一个错误,我想我是在选择那个答案,谢谢你提醒我@Mikezri不认为这是OP想要的,但当然这是Kotlin的方式。优雅的解决方案+1
    typealias FlightNum = String
    typealias Day = Int
    
    fun mapReservas(reservas: List<Reservas>): 
                      Map<Pair<FlightNum, Day>, List<Reservas>>  {
       // ...
    }
    
    fun interval(reservas: List<Reservas>, 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()
    }
    
    val reservasNum = it.key.first
    val reservasDay = it.key.second
    
    same as 
    
    val (reservasNum, reservasDa) = it.key
    
    .filter { (key, _) -> ... }