比方说,我有一个这样的数组:[1,4,7,4,2,2,4,7,1,2]
。用相同的元素将数组分成小数组
我需要划分这个阵列与相同的元件阵列,使其显示在迅速的结果作为这样的功能:
result = [[1,1],[4,4,4],[7,7],[2,2,2]]
。
如何在swift中做到这一点?在此先感谢
比方说,我有一个这样的数组:[1,4,7,4,2,2,4,7,1,2]
。用相同的元素将数组分成小数组
我需要划分这个阵列与相同的元件阵列,使其显示在迅速的结果作为这样的功能:
result = [[1,1],[4,4,4],[7,7],[2,2,2]]
。
如何在swift中做到这一点?在此先感谢
您可以使用助手字典将数组的值分类到适当的分档。例如:
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挂描述:
例如:
/* 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 }
另一种选择是创建一个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
呢。
看看[如何按照Swift中的数组元素进行分组](http://stackoverflow.com/questions/31220002/how-to-group-by-the-elements-of-an-array -in-swift) - 这将生成分组元素的字典。从那里获得一组分组是一小步。 – Hamish
@Hamish问题是在这种情况下,他只有晚餐或启动,所以他知道filterArrays的数量,但在我的情况下,我不知道filterArrays的数量,该数组只是一个例子。 –
看看答案,而不是问题。答案适用于任何数量的分组。 – Hamish