首页 > 解决方案 > 有没有更实用的方法将数组重新排列成字典

问题描述

我想知道是否有更好和更实用的方法将数组重新排列到字典中,其中每个键是另一个包含 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)}

结果打印:

结果打印

标签: iosswiftfunctional-programming

解决方案


Dictionary有一个接受 a Sequenceof 键/值对的初始化器,以及一个用于解析具有重复键的对的闭包。 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是一个将数组与匹配键组合的闭包。


推荐阅读