You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Kotlin/Java中如何基于值为列表的Map过滤FlightCardModel列表

问题

现有以下数据结构:

val flightsList = mutableStateListOf<FlightCardModel>()

data class FlightCardModel(
    val flightCardSegmentModel: List<FlightCardSegmentModel>,
    // 其他字段
)

data class FlightCardSegmentModel(
    val stops: Int,
    val departureAirportCode: String,
    // 其他字段
)

以及筛选条件的Map结构:

val segmentStops: Map<String, List<StopsButtonModel>>

data class StopsButtonModel(
    val stop: Int,
    // 其他字段
)

需要实现的过滤逻辑:

  • 以segmentStops的键匹配FlightCardSegmentModel的departureAirportCode
  • 对应键的值列表(List<StopsButtonModel>)中包含的stop值,是该出发机场允许的经停站数
  • 若segmentStops不包含某个departureAirportCode,或对应值列表为空,该航班直接保留

之前实现过针对segmentStops: Map<String, StopsButtonModel>(值为单个对象)的过滤代码,但现在需要适配值为列表的场景:

val count = flightsList.filter {
        segmentStops.keys.all { i ->
            when (segmentStops[i]?.stop) {
                0 -> {
                    it.flightCardSegmentModel.find { it.departureAirportCode == i }?.stops == 0
                }
                1 -> {
                    it.flightCardSegmentModel.find { it.departureAirportCode == i }?.stops == 1
                }
                2 -> {
                    it.flightCardSegmentModel.find { it.departureAirportCode == i }?.stops == 2
                }
                else -> {
                    it.flightCardSegmentModel.find { it.departureAirportCode == i }?.stops >= 0
                }
            }
        }
    }.size
解决方案

修改后的过滤代码如下,核心是将单个stop值的判断改为判断航班的stops是否在允许的stop列表中,同时处理空列表或无对应键的情况:

val count = flightsList.filter { flight ->
    // 遍历所有segmentStops的键,确保每个键对应的条件都满足
    segmentStops.keys.all { airportCode ->
        val allowedStops = segmentStops[airportCode]?.map { it.stop }.orEmpty()
        // 如果允许的stop列表为空,直接通过过滤
        if (allowedStops.isEmpty()) {
            true
        } else {
            // 找到航班中对应出发机场的segment,检查其stops是否在允许列表中
            flight.flightCardSegmentModel.find { it.departureAirportCode == airportCode }?.let { segment ->
                allowedStops.contains(segment.stops)
            } ?: false // 如果航班没有对应机场的segment,不保留
        }
    }
}.size

关键逻辑说明:

  1. 处理允许列表:用map { it.stop }把List<StopsButtonModel>转成Int类型的允许经停数列表,orEmpty()避免空指针
  2. 空列表/无键的情况:如果允许列表为空(包括Map中无该键的情况),直接返回true,保留该航班
  3. 匹配航班segment:找到航班中对应出发机场的segment,判断其stops是否在允许列表内;如果航班没有该机场的segment,则不保留

内容的提问来源于stack exchange,提问作者imn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 19:47:08