我有一组这样的数组[[1,2,3,2,3,4,5,5,6,7,8,1,8,9] ]。如果一个项目与另一个项目相交,然后合并这些项目。但是我得到了重复的项目,例如[[1,2],[2,3],[1,8,9],[1,2,3,8,9 ] [4,5],[5,6],[4,5,6],[7,8]],其中那些项目集[1,2],[2,3] [1,8,9 ],[4,5],[5,6],[7,8]是重复的。
我尝试使用reduce方法,但是我期望的输出仍然没有得到它。
var newtotalOverlapingSet = Set<[UICollectionViewLayoutAttributes]>()
if totoalOverLapArray.count > 0{
let _ = totoalOverLapArray.reduce(totoalOverLapArray[0]){ firstSet, secondSet in
if firstSet.intersection(secondSet).count > 0{
newtotalOverlapingSet.insert(Array(firstSet.union(secondSet)))
return firstSet.union(secondSet)
}
return secondSet
}}
这是我想要实现的预期输出[[1,2,3,7,8,9],[4,5,6]]。
答案 0 :(得分:2)
创建一个result
类型的空数组[[Int]]
。如果当前intersection
的{{1}}中有Set
的任何元素不为空,则用其并集更新result
。否则将Set
附加到Set
数组中。
result
使用数组调用此方法
func group(arr: [[Int]]) -> [[Int]] {
if (arr.reduce(0) { $0 + $1.count }) == Set(arr.reduce([Int](), +)).count {
return arr
}
let result = arr.reduce(into: [[Int]]()) { (result, subArr) in
if let index = result.firstIndex(where: { !Set($0).intersection(subArr).isEmpty }) {
result[index] = Set(result[index]).union(subArr).sorted()
} else {
result.append(Array(subArr))
}
}
return group(arr:result)
}
[[1、2、3、7、8、9],[4、5、6]]
let arr1 = [[1,2], [2, 3], [4,5], [5, 6,], [7, 8], [1,8,9]]
print(group(arr: arr1))
[[1、2、3、4、5、6、7、8、9、10]]
答案 1 :(得分:2)
尝试以下代码:
func combine(input: [[Int]]) -> [[Int]] {
return input
.reduce([Set<Int>]()) { acc, elem in
let set = Set(elem)
return acc.firstIndex { !$0.isDisjoint(with: set) }
.map { index in
acc.enumerated().compactMap {
if $0.offset == index {
return acc
.filter { !$0.isDisjoint(with: set) }
.reduce(Set()) { $0.union($1) }
.union(set)
}
return $0.element.isDisjoint(with: set) ? $0.element : nil
}
} ?? acc + [set]
}
.map { Array($0).sorted() }
}
答案 2 :(得分:2)
只是为了好玩,尝试坚持使用reduce
:
func mergeIntersections(of arrays: [[Int]]) -> [Set<Int>] {
return arrays.reduce([Set<Int>]()) { result, nextChunk in
let partialResult = result.reduce(into: (mergedChunk: Set(nextChunk), unmergedChunks: [Set<Int>]())) { (result, existingChunk) in
if !result.mergedChunk.intersection(existingChunk).isEmpty {
result.mergedChunk.formUnion(existingChunk)
} else {
result.unmergedChunks.append(existingChunk)
}
}
return partialResult.mergedChunk.isEmpty
? partialResult.unmergedChunks
: partialResult.unmergedChunks + [partialResult.mergedChunk]
}
}
let arraysOfInts = [[1,2], [2,3], [4,5], [5,6], [7,8], [1,8,9]]
mergeIntersections(of: arraysOfInts) // [{6, 4, 5}, {2, 1, 7, 8, 9, 3}]
但是,我真的好奇的是,它与UICollectionViewLayoutAttributes
有什么关系? :-)