如何对数组进行分组

时间:2018-11-21 21:10:45

标签: arrays swift

如何按第一个相同元素对数组进行分组 例如我有这样的数组“

var Array = ["1","1","1","2","2","1","1"]

我想像这样对数组进行分组:

groupedArray = [
        ["1","1","1"],
        ["2","2"],
        ["1","1"]
    ]

谢谢!

2 个答案:

答案 0 :(得分:2)

不要命名您的变量Array,您将屏蔽Swift.Array类型,这将导致数量众多的怪异错误。 Swift中的变量名称应以小写字母开头。

使用prefix(while:)从指定的索引开始收集相同的元素。然后继续前进该索引:

let array = ["1","1","1","2","2","1","1"]

var index = 0
var groupedArray = [[String]]()
while index < array.count {
    let slice = array[index...].prefix(while: { $0 == array[index] })
    groupedArray.append(Array(slice))
    index = slice.endIndex
}

答案 1 :(得分:2)

您可以扩展Collection,将其Element约束为Equatable协议,并创建一个计算属性以使用reduce(into:)方法返回分组的元素。您只需要检查上一个集合中是否有一个与当前元素相等的最后一个元素,如果为true,则将当前元素追加到上一个集合中,否则将添加一个新集合:

extension Collection where Element: Equatable {
    var grouped: [[Element]] {
        return reduce(into: []) {
            $0.last?.last == $1 ?
            $0[$0.index(before: $0.endIndex)].append($1) :
            $0.append([$1])
        }
    }
}

let array = ["1","1","1","2","2","1","1"]
let grouped = array.grouped
print(grouped)  // "[["1", "1", "1"], ["2", "2"], ["1", "1"]]\n"
相关问题