合并物品的二维阵列

时间:2019-05-15 14:47:16

标签: swift

我有一组这样的数组[[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]]。

3 个答案:

答案 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有什么关系? :-)