如何基于元组首个元素判断一个元组列表是否为另一个元组列表的子集
实现方案
核心思路是先提取基准列表的所有元组首元素转为集合,再校验待判断列表的所有元组首元素都存在于该集合中即可:
def subset[A, B](fullList: List[(A, B)], candidateList: List[(A, B)]): Boolean = { // 提取基准列表所有元组的第一个元素转为集合,查询复杂度O(1) val allFirstKeys = fullList.map(_._1).toSet // 校验待判断列表的每个元组首元素都在集合中 candidateList.forall(tuple => allFirstKeys.contains(tuple._1)) }
测试效果
// 用例1 返回true subset(List(('a', 1), ('b', 2), ('c', 3)), List(('a', 4), ('b', 5))) // 用例2 返回false subset(List(('a', 1), ('b', 2), ('c', 3)), List(('a', 4), ('b', 5), ('f', 6)))
原有写法问题说明
你之前的代码存在三个核心问题:
- 遍历对象搞反:应该遍历待判断是否为子集的列表,而非基准列表
- 匹配规则错误:
contains匹配了整个元组,实际只需要匹配第一个元素,和元组第二个元素的值完全无关 - 语法错误:
forall接收的参数是单个元组类型的入参,不能直接拆成(char: Char, num: Int)两个参数,contains里的下划线_也没有对应正确的语义上下文
内容的提问来源于stack exchange,提问作者Bassusour
相关产品推荐
相关产品推荐

