Return 只有出现次数最多的元素
Return only elements with maximum number of ocurrences
假设我们在 Kotlin 中有以下结构:
val allExams = setOf("A", "B", "C", "D", "E", "F")
val examMap = mutableMapOf<String, Set<String>>()
examMap["1"] = setOf("A","B")
examMap["2"] = setOf("A","B","C")
examMap["3"] = setOf("A","B","C","D")
examMap["4"] = setOf("E")
examMap["5"] = setOf("F")
如何过滤以仅保留具有最大匹配元素数的地图项?
在上述示例中,我想删除 examMap["1"]
和 examMap["2"]
,因为在 examMap["3"]
中我有 "A"
、"B"
、"C"
和 "D"
(这是 allExams
中具有最大匹配元素数的项目)。 examMap["4"]
和 examMap["5"]
将被保留,因为它们是地图上唯一具有这些值的项目。
所以最后我想要具有以下值的地图:
examMap["3"] = setOf("A","B","C","D")
examMap["4"] = setOf("E")
examMap["5"] = setOf("F")
这会给你预期的结果:
val result = mutableMapOf<String, Set<String>>()
examMap.toList().sortedByDescending { (_, v) -> v.size }
.forEach {
if (result.isEmpty()
|| result.values.none { rList -> rList.containsAll(it.second) }) {
result.put(it.first, it.second)
}
}
}
想法是:
- 首先将map中的Set按
set.size
descending.Because排序,set中的元素越多,越有可能覆盖其他set
- 然后从最大的集合开始,检查已经选取的集合(在
result
中)是否包含当前集合中的所有元素,以决定是否将其附加到result
对于给定的输入,result
将是:
{3=[A, B, C, D], 4=[E], 5=[F]}
假设我们在 Kotlin 中有以下结构:
val allExams = setOf("A", "B", "C", "D", "E", "F")
val examMap = mutableMapOf<String, Set<String>>()
examMap["1"] = setOf("A","B")
examMap["2"] = setOf("A","B","C")
examMap["3"] = setOf("A","B","C","D")
examMap["4"] = setOf("E")
examMap["5"] = setOf("F")
如何过滤以仅保留具有最大匹配元素数的地图项?
在上述示例中,我想删除 examMap["1"]
和 examMap["2"]
,因为在 examMap["3"]
中我有 "A"
、"B"
、"C"
和 "D"
(这是 allExams
中具有最大匹配元素数的项目)。 examMap["4"]
和 examMap["5"]
将被保留,因为它们是地图上唯一具有这些值的项目。
所以最后我想要具有以下值的地图:
examMap["3"] = setOf("A","B","C","D")
examMap["4"] = setOf("E")
examMap["5"] = setOf("F")
这会给你预期的结果:
val result = mutableMapOf<String, Set<String>>()
examMap.toList().sortedByDescending { (_, v) -> v.size }
.forEach {
if (result.isEmpty()
|| result.values.none { rList -> rList.containsAll(it.second) }) {
result.put(it.first, it.second)
}
}
}
想法是:
- 首先将map中的Set按
set.size
descending.Because排序,set中的元素越多,越有可能覆盖其他set - 然后从最大的集合开始,检查已经选取的集合(在
result
中)是否包含当前集合中的所有元素,以决定是否将其附加到result
对于给定的输入,result
将是:
{3=[A, B, C, D], 4=[E], 5=[F]}