提问者:小点点

用Swift翻字典


我正试着翻阅这本字典

let interestingNumbers = [
"Prime": [2, 3, 5, 7, 11, 13],
"Fibonacci": [1, 1, 2, 3, 5, 8],
"Square": [1, 4, 9, 16, 25],
]

我想要跟踪这本字典中最大的数字,以及与这个数字对应的键的名称

下面是我的代码:

var largest = 0
var largestName: String?

for (names, numbers) in interestingNumbers {
    for number in numbers {
        for name in names {
            if number > largest {
                largest = number
                largestName = interestingNumbers(forKey: largest)
            }
        }

    }
}
print(largest)
print(largestName)

但我得到了以下类型的错误:错误:无法调用非函数类型“[String:[Int]]”的值

我不知道我在哪里错过了适当的迭代。请帮忙。谢谢


共1个答案

匿名用户

如果您直接在外部循环中添加名称数字的打印,您将意识到不需要像您这样循环名称并且也没有必要在循环中再次尝试使用字典。

因此我们可以跳过一个循环,直接使用names变量来记住最大值数组的名称。此外,也没有理由循环numbers数组,因为数组有一个max()函数可以使用。

因此代码变成

for (names, numbers) in interestingNumbers {
    if let max = numbers.max(), max > largest {
        largest = max
        largestName = names
    }
}

一种更简单的方法是使用一些高阶函数来获得最大值

interestingNumbers.mapValues({ $0.max() ?? 0 }).max(by: { $0.value < $1.value}) 

这将返回一个元组,可以这样使用

if let tuple = interestingNumbers.mapValues({ $0.max() ?? 0 }).max(by: { $0.value < $1.value})  {
    largest = tuple.1
    largestName = tuple.0
}