ios - 有没有更实用的方法将数组重新排列成字典
问题描述
我想知道是否有更好和更实用的方法将数组重新排列到字典中,其中每个键是另一个包含 2 个项目的数组?
我已经制作了这两个示例,但我仍在学习函数式编程并且无法获得更好的解决方案。谢谢你们!
[编辑]
@bcal 对此给出了很好的解决方案;我认为欢迎任何人为其他解决方案做出贡献!
let myObjArray = ["A", "B", "C", "F", "G", "H", "I", "J", "K"]
var myIndexTwoObjArr: [Int: [String]] = [:]
// first way
var index = 0
for item in myObjArray {
if myIndexTwoObjArr[index] == nil {
myIndexTwoObjArr[index] = [item]
}else if myIndexTwoObjArr[index]!.count < 2 {
myIndexTwoObjArr[index]?.append(item)
index += 1
}
}
print("first way")
myIndexTwoObjArr.forEach{print($0)}
// second way
index = 0
myObjArray.forEach { item in
if myIndexTwoObjArr[index] == nil {
myIndexTwoObjArr[index] = [item]
}else if myIndexTwoObjArr[index]!.count < 2 {
myIndexTwoObjArr[index]?.append(item)
index += 1
}
}
print("second way")
myIndexTwoObjArr.forEach{print($0)}
// third way [thanks to bcal answer]
myIndexTwoObjArr = [:]
myIndexTwoObjArr = [Int: [String]](myObjArray.enumerated().map({($0.0/2, [$0.1])}), uniquingKeysWith: +)
print("third way [thanks to bcal answer]")
myIndexTwoObjArr.forEach{print($0)}
结果打印:
解决方案
Dictionary
有一个接受 a Sequence
of 键/值对的初始化器,以及一个用于解析具有重复键的对的闭包。
https://developer.apple.com/documentation/swift/dictionary/3127161-init
myIndexTwoObjArr = [Int: [String]](
myObjArray.enumerated().map({($0.0/2, [$0.1])}),
uniquingKeysWith: +
)
第一个参数是一个函数序列......
•enumerated
将数组的元素转换为元组序列(Int, String)
,其中元组中的第一个值是元素的索引。
• <code>map 将(Int, String)
元组转换为元(Int, [String])
组,其中第一个值是索引÷2,第二个值是Array
包含单个 的String
。
初始化器的第二个参数Dictionary
是一个将数组与匹配键组合的闭包。
推荐阅读
- java - 如果用户输入是空行,需要帮助打破循环
- python - 有没有更好的方法来编写这个简短的脚本?
- excel - VBA 和 Internet Explorer 自动化。在 msgbox 弹出窗口中单击“确定”
- javascript - React.useState() 钩子不反映新值
- c - 分段错误和不兼容的指针类型警告与 scandir()
- excel-formula - 检查日期和时间是否在给定的excel范围列表中
- php - 在 Flutter 中隐藏 HTTP 请求 URL
- c# - C# 表达式树,使用具有静态表达式类型的表达式进行 lambda 调用
- c - 如果未定义,则用于定义宏的紧凑版本
- javascript - 本地存储变量更改时如何触发函数?