将数组划分为具有相同元素的小数组

时间:2016-11-04 13:23:29

标签: arrays swift filter

让我说我有这样一个数组:[1,4,7,4,2,2,4,7,1,2]

我需要一个函数将这个数组划分为具有相同元素的数组,因此它在swift中显示结果:

result = [[1,1],[4,4,4],[7,7],[2,2,2]]

如何在swift中做到这一点?提前致谢

2 个答案:

答案 0 :(得分:1)

您可以使用辅助字典将数组的值分类到适当的bin中。 E.g:

let arr = [1, 4, 7, 4, 2, 2, 4, 7, 1, 2]
var dict: [Int: [Int]] = [:]
arr.forEach { dict[$0] = (dict[$0] ?? []) + [$0] }
let inBins = dict.map{ $1 }.sorted{ $0.first ?? 0 < $1.first ?? 0 }
print(inBins) // [[1, 1], [2, 2, 2], [4, 4, 4], [7, 7]]

或者,使用分类部分的常规Sequence扩展名,如@Hamish链接的线程中接受的答案所述:

E.g:

/* from https://stackoverflow.com/a/39388832/4573247:
   @mientus's Swift 3 translation of @oisdk's accepted answer */
public extension Sequence {
    func categorise<U : Hashable>(_ key: (Iterator.Element) -> U) -> [U:[Iterator.Element]] {
        var dict: [U:[Iterator.Element]] = [:]
        for el in self {
            let key = key(el)
            if case nil = dict[key]?.append(el) { dict[key] = [el] }
        }
        return dict
    }
}

let arr = [1, 4, 7 ,4, 2, 2, 4, 7, 1, 2]
let inBins = arr.categorise{ $0 }.map{ $1 }.sorted{ $0.first ?? 0 < $1.first ?? 0 }
print(inBins) // [[1, 1], [2, 2, 2], [4, 4, 4], [7, 7]]

不需要对垃圾箱进行分类(如上所述)?然后将上面两个选项简化为(简单地删除最后一个sortin部分):

// ... first alternative above
let inBins = dict.map{ $1 }

// ... 2nd alternative above
let inBins = arr.categorise{ $0 }.map{ $1 }

答案 1 :(得分:0)

另一种选择可能是创建NSCountedSet

let array = [1,4,7,4,2,2,4,7,1,2]
let countedSet = NSCountedSet(array: array)

然后,您可以轻松获取每个独特元素的计数:

let countForOne = countedSet.count(for: 1)

据我所知,还没有原始的Swift等同于NSCountedSet