我有一个包含如下数据的数组:[值]#模式
我想按[模式]将此数组拆分为[Value]数组,但保留数据的相同位置,以便可以为同一模式的多个数组:
例如:
let array = ["23.88", "24", "30", "24.16#C", "25#C", "12#C", "24.44#O", "50#O" , "31", "40" , "44#C", "55#C"]
// Result
No mode ---> [23.88,24,30]
mode = C ---> [24.16,25,12]
mode = O ---> [24.44,50]
No mode ---> [31,40]
mode = C ---> [44,55]
我试过这个扩展,但不是我想要的
extension SequenceType {
func groupBy<U : Hashable>(@noescape keyFunc: Generator.Element -> U) -> [U:[Generator.Element]] {
var dict: [U:[Generator.Element]] = [:]
for el in self {
let key = keyFunc(el)
if case nil = dict[key]?.append(el) { dict[key] = [el] }
}
return dict
}
}
它给出了如下结果:
No mode ---> [23.88,24,30,31,40]
mode = C ---> [24.16,25,12,44,55]
mode = O ---> [24.44,50]
4条答案
按热度按时间dly7yett1#
我建议您使用带元组的数组(用来保存键)。组成此数组,然后您可以轻松地将其重新Map为您需要的格式:
uajslkp62#
您需要修改
groupBy
扩展以分组到一个2元组数组而不是字典中,其中第一个元组元素对应于一个非唯一的“key”,第二个tuple元素是self
数组中可归类到给定键的后续元素的数组。SequenceType
扩展名*另请注意,现在扩展中的通用
U
符合Comparable
就足够了,因为我们只使用U
元素作为元组中的“伪”键。通过此修改,我们可以将
groupBy(..)
方法调用为#X
)*如果希望删除结果数组中的原始模式标记(
#X
),可以在调用groupBy
之后应用额外的map
操作。删除结果值为
String
的标记:或者,结果值为
Double
:或者,同时执行
groupBy
和map
,无需中间赋值:(类似于生成的
Double
值的情况。)e4yzc0pl3#
请看下面的代码:
结果:
sg24os4d4#
六年后,仍然没有简单的方法来获得这种细分。至少我不知道有什么。我今天遇到了这个问题,以下是我是如何解决这个问题的(2022年,使用SWIFT 5+)。
实施是
Collection
的扩展:使用它是一个简单的一行程序,如下面的测试用例所示:
我使用空集合,甚至使用可选的键进行了测试,就像您在原始问题中所做的那样。效果很好。