使用 Kotlin 中的 Map 过滤对象列表
Filtering the list of objects using the Map in Kotlin
我正在尝试创建一个字典过滤器来过滤传入的参数列表。
问题是当列表中有应该过滤和删除的参数时 - 我得到一个 NullPointerException。
基本信息:
这是过滤器的样子:
data class Filter(
val filters: Map<ParameterName, Set<String>>
)
data class ParameterName(
val key: String
)
过滤器示例:
Filter(filters={ParameterName(key=Manufacturer)=[brand, producer]})
筛选列表 (List<Parameter>
) 具有以下结构:
data class Parameter(
val id: String?,
val name: String?,
val values: List<String>?
)
List<Parameter>
的例子
[Parameter(id=123, name=brand, values=[Nike]), Parameter(id=345, name=color, values=[black, pink]), Parameter(id=823, name=test, values=[some, thing])]
逻辑是过滤列表改成Map。其中:
a) String (key) 是过滤器键的值(过滤器映射中的键具有主值和其下的任何其他名称。例如 - 在 Manufacturer 下我们有值“brand”或“producer”)
b)参数值(如Nike)赋值给ParameterValue对象(val值:String)。
我准备了什么:
fun filterParameters(
parametersList: List<Parameter>,
filters: Map<ParameterName, Set<String>>
): Map<String, ParameterValue> {
return parametersList.associate { param ->
filters.filter {
it.value.first().equals(param.name, ignoreCase = true)
}.keys.first().key to ParameterValue(value = param.values!!.first())
}.toMap()
}
流程示例:
- 方法的输入:
a) 参数列表:
listOf(
Parameter(
"123",
"brand",
listOf("Nike")
),
Parameter(
"345",
"color",
listOf("black", "pink")
),
Parameter(
"823",
"test",
listOf("some", "thing")
)
)
b) 过滤器:
mapOf(
ParameterName("Manufacturer") to setOf("brand", "producer")
)
2)预期输出:
{Manufacturer=ParameterValue(value=Nike)}
预期输出结构:
Map<String, ParameterValue>
哪里
data class ParameterValue(
val parameterId: String? = null,
val value: String,
val valueId: String? = null
)
所以我们只需填充值 - String
data class Parameter(
val id: String?,
val name: String?,
val values: List<String>?
)
val parameters = listOf(
Parameter("123", "brand", listOf("Nike")),
Parameter("3433", "color", listOf("red", "black")),
Parameter("22313", "model", listOf("air max")),
Parameter("2312", "origin", listOf("USA")),
Parameter(null, "size", listOf("7", "7.5", "8", "9")),
Parameter("987", null, listOf("lalala")),
Parameter("999", "code", null),
Parameter(null, null, null)
)
val filters = mapOf(
"Manufacturer" to setOf("brand", "producer"),
"Country" to setOf("origin", "from")
)
fun getValuesForParameterName(parameters: List<Parameter>, filters: Map<String, Set<String>>): Map<String, List<String>> {
return parameters
.filter { parameter -> parameter.name in filters.flatMap { map -> map.value } }
.map { parameter -> filters.filter { map -> map.value.contains(parameter.name) }.keys.first() to parameter.values }
.groupBy { (name, _) -> name }
.map { (name, values) -> name to values.map { (_, list) -> list ?: emptyList() }.flatten() }
.toMap()
}
val result = getValuesForParameterName(parameters, filters)
println(result) // Output: {Manufacturer=[Nike], Property=[USA]}
println(result["Manufacturer"]) // Output: [Nike]
println(result["Country"]) // Output: [USA]
我正在尝试创建一个字典过滤器来过滤传入的参数列表。
问题是当列表中有应该过滤和删除的参数时 - 我得到一个 NullPointerException。
基本信息:
这是过滤器的样子:
data class Filter(
val filters: Map<ParameterName, Set<String>>
)
data class ParameterName(
val key: String
)
过滤器示例:
Filter(filters={ParameterName(key=Manufacturer)=[brand, producer]})
筛选列表 (List<Parameter>
) 具有以下结构:
data class Parameter(
val id: String?,
val name: String?,
val values: List<String>?
)
List<Parameter>
[Parameter(id=123, name=brand, values=[Nike]), Parameter(id=345, name=color, values=[black, pink]), Parameter(id=823, name=test, values=[some, thing])]
逻辑是过滤列表改成Map
a) String (key) 是过滤器键的值(过滤器映射中的键具有主值和其下的任何其他名称。例如 - 在 Manufacturer 下我们有值“brand”或“producer”)
b)参数值(如Nike)赋值给ParameterValue对象(val值:String)。
我准备了什么:
fun filterParameters(
parametersList: List<Parameter>,
filters: Map<ParameterName, Set<String>>
): Map<String, ParameterValue> {
return parametersList.associate { param ->
filters.filter {
it.value.first().equals(param.name, ignoreCase = true)
}.keys.first().key to ParameterValue(value = param.values!!.first())
}.toMap()
}
流程示例:
- 方法的输入:
a) 参数列表:
listOf(
Parameter(
"123",
"brand",
listOf("Nike")
),
Parameter(
"345",
"color",
listOf("black", "pink")
),
Parameter(
"823",
"test",
listOf("some", "thing")
)
)
b) 过滤器:
mapOf(
ParameterName("Manufacturer") to setOf("brand", "producer")
)
2)预期输出:
{Manufacturer=ParameterValue(value=Nike)}
预期输出结构:
Map<String, ParameterValue>
哪里
data class ParameterValue(
val parameterId: String? = null,
val value: String,
val valueId: String? = null
)
所以我们只需填充值 - String
data class Parameter(
val id: String?,
val name: String?,
val values: List<String>?
)
val parameters = listOf(
Parameter("123", "brand", listOf("Nike")),
Parameter("3433", "color", listOf("red", "black")),
Parameter("22313", "model", listOf("air max")),
Parameter("2312", "origin", listOf("USA")),
Parameter(null, "size", listOf("7", "7.5", "8", "9")),
Parameter("987", null, listOf("lalala")),
Parameter("999", "code", null),
Parameter(null, null, null)
)
val filters = mapOf(
"Manufacturer" to setOf("brand", "producer"),
"Country" to setOf("origin", "from")
)
fun getValuesForParameterName(parameters: List<Parameter>, filters: Map<String, Set<String>>): Map<String, List<String>> {
return parameters
.filter { parameter -> parameter.name in filters.flatMap { map -> map.value } }
.map { parameter -> filters.filter { map -> map.value.contains(parameter.name) }.keys.first() to parameter.values }
.groupBy { (name, _) -> name }
.map { (name, values) -> name to values.map { (_, list) -> list ?: emptyList() }.flatten() }
.toMap()
}
val result = getValuesForParameterName(parameters, filters)
println(result) // Output: {Manufacturer=[Nike], Property=[USA]}
println(result["Manufacturer"]) // Output: [Nike]
println(result["Country"]) // Output: [USA]