在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
关键逻辑说明:
- 处理允许列表:用
map { it.stop }把List<StopsButtonModel>转成Int类型的允许经停数列表,orEmpty()避免空指针 - 空列表/无键的情况:如果允许列表为空(包括Map中无该键的情况),直接返回
true,保留该航班 - 匹配航班segment:找到航班中对应出发机场的segment,判断其stops是否在允许列表内;如果航班没有该机场的segment,则不保留
内容的提问来源于stack exchange,提问作者imn
相关产品推荐
相关产品推荐

