【问题标题】:Return only elements with maximum number of ocurrences仅返回出现次数最多的元素
【发布时间】:2021-12-03 18:11:12
【问题描述】:

假设我们在 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")

【问题讨论】:

  • c实际上是examMap吗?
  • 是的,很抱歉打错了
  • 如果你有另一个条目map[6] = [ B, C, X]你会保留它吗?
  • 否,因为它必须匹配 allExams 中的元素
  • @user2620925 所以如果 allExams 有'X',你也想保留地图[6]?

标签: dictionary kotlin set


【解决方案1】:

这会给你预期的结果:

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)
        }
    }
}

想法是:

  • 首先按set.size降序对map中的Sets进行排序。因为set中的元素越多,它覆盖其他sets的机会就越大
  • 然后从最大的集合开始,检查已经选择的集合(result)是否包含当前集合中的所有元素,决定是否追加到result

使用给定的输入,result 将是:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2011-04-17
    相关资源
    最近更新 更多