如何对多维Int数组无重复两两比对,并用高阶函数找交集数组?
多维Int数组无重复两两比对并筛选交集数组的高阶函数实现
当然可以用reduce、map、filter这类高阶函数配合闭包完成需求,核心思路是通过索引规则避免重复比对,再利用Set高效判断交集。以下是具体实现步骤和代码示例(以Swift为例):
步骤1:预处理数组,转换为Set提升效率
先将多维数组中的每个子数组转换为Set,因为Set的交集判断操作比原生数组更高效,尤其当子数组元素较多时:
let myArr = [[1,2,3], [4,5], [3,6], [7,8,9], [5,10]] let setArray = myArr.map { Set($0) }
步骤2:生成无重复的索引对
利用reduce生成所有i < j的索引组合,确保每对数组只比对一次:
let validIndexPairs = (0..<myArr.count).reduce(into: [(Int, Int)]()) { result, i in // 从i+1开始遍历,彻底避免重复比对 (i+1..<myArr.count).forEach { j in result.append((i, j)) } }
步骤3:筛选存在交集的数组对
用filter判断对应Set是否存在交集,再通过map映射回原数组的子数组对:
let overlappingArrayPairs = validIndexPairs.filter { i, j in // isDisjoint返回true表示无交集,取反即为存在共同数字 !setArray[i].isDisjoint(with: setArray[j]) }.map { i, j in (myArr[i], myArr[j]) }
结果说明
上述代码运行后,overlappingArrayPairs会包含所有符合要求的无重复数组对:
([1,2,3], [3,6])([4,5], [5,10])
如果只需要保留索引对而非实际数组元素,去掉最后的map步骤即可。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

