使用随机Ints数组过滤Dictionary以创建新的dict

时间:2018-06-06 19:54:34

标签: arrays swift dictionary enumeration

所以我有这种方法在1-9之间得到一个随机数组,在1到7之间随机抽取一次。

let n = arc4random_uniform(7) + 1
var arr: [UInt32] = []
for _ in 0 ... n {
    var temp = arc4random_uniform(9) + 1
    while arr.contains(temp) {
        temp = arc4random_uniform(9) + 1
    }
    print(temp)
    arr.append(temp)
}
print(arr)

这样就得到了像[1,4,2]或[5,7,3,4,6]这样的数组。我有一个方法可以将另一个字符串数组转换为枚举字典。

    var someArray: [String] = ["War", "Peanuts", "Cats", "Dogs", "Nova", "Bears", "Pigs", "Packers", "Mango", "Turkey"]

extension Collection  {
    var indexedDictionary: [Int: Element] {
        return enumerated().reduce(into: [:]) { $0[$1.offset] = $1.element }
    }
}
let dict1 = someArray.indexedDictionary
print(dict1)

给我索引字典

[1:"War", 2:"Peanuts",..etc]

我的问题是使用随机数组的Int如何创建一个只包含那些键及其值的新词典?

例如arr = [3,1,5] 我如何获得

的新词典

[3:"dogs", 1:"Peanuts",5:"Bears"].

1 个答案:

答案 0 :(得分:3)

这应该这样做:

let finalDict = dict1.filter { arr.contains($0.key) }

更新

您甚至可以更进一步,跳过整个字符串到数组映射。所以删除

extension Collection  {
    var indexedDictionary: [Int: Element] {
        return enumerated().reduce(into: [:]) { $0[$1.offset] = $1.element }
    }
}
let dict1 = someArray.indexedDictionary
print(dict1)

然后使用它:

Swift 4:

let finalArray = someArray.enumerated().flatMap { arr.contains($0.offset) ? $0.element : nil }

Swift 4.1:

let finalArray = someArray.enumerated().compactMap { arr.contains($0.offset) ? $0.element : nil }

更新2:

如果你需要一个字典而不是一个数组,最后使用它:

Swift 4:

let finalDict = someArray.enumerated().flatMap { randomInts.contains($0.offset) ? ($0.offset, $0.element) : nil }.reduce(into: [:]) { $0[$1.0] = $1.1 }

Swift 4.1:

let finalDict = someArray.enumerated().compactMap { randomInts.contains($0.offset) ? ($0.offset, $0.element) : nil }.reduce(into: [:]) { $0[$1.0] = $1.1 }