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.sizedescending.Because排序,set中的元素越多,越有可能覆盖其他set
  • 然后从最大的集合开始,检查已经选取的集合(在result中)是否包含当前集合中的所有元素,以决定是否将其附加到result

对于给定的输入,result 将是:

{3=[A, B, C, D], 4=[E], 5=[F]}