查找[String:[Int]] Swift字典中的最大数字

时间:2017-05-09 17:30:03

标签: swift dictionary

我是Swift的新手。 我有这个代码的错误,我在这个网站上找不到任何答案。 我打印的数字最多,但我想打印最大数量的那种。

$lastId = $mysqli->insert_id; // this is how you will get last inserted id

2 个答案:

答案 0 :(得分:2)

请改为尝试:

var largestNumber = 0
var largestNumberKind: String!

for (kind, numbers) in interestingNumbers {
    for x in numbers {
        if x > largestNumber {
            largestNumber = x
            largertNumberKind = kind
        }
    }
}

print("the largest number is = \(largestNumber)")
print("the largest number kind is = \(largestNumberKind)")

关于您的原始代码:

  • 你只跟踪最大的数字,丢失了你想要的那种信息。我添加的largestNumberKind变量就是这样。
  • 循环kind: String没有任何意义(for y in kind行)。你的外部循环已经一次迭代一个键,所以这样的内部循环是没有意义的。

答案 1 :(得分:1)

Paulo的方法没有任何问题(有一些小的修正;请参见那里的评论),但这是探索更多不需要循环和变异的功能方法的合理问题。

例如,我们可以将每种类型展平为最大元素(如果它为空,则为Int.min),然后采用最高最大值的种类:

interestingNumbers
    .map { (kind: $0, maxValue: $1.max() ?? .min) } // Map each kind to its max value
    .max { $0.maxValue < $1.maxValue }?             // Find the kind with the max value
    .kind                                           // Return the kind

这确实创造了一种我不爱的轻微边缘条件。如果您评估以下内容:

let interestingNumbers = [
    "ImaginaryReals": [],
    "Smallest": [Int.min],
]

这里没有明确定义哪些将被退回。显然,正确答案是&#34;最小,&#34;但它依赖于顺序。通过更多的思考(和代码),我们可以解决这个问题。问题是我们通过将空列表视为最大Int.min来采取一点捷径(这也阻止了我们的系统为Float之类的事情工作,所以很难过)。所以,让我们解决这个问题。让我们准确一点。空列表的maxnil。我们想放弃这些元素。

我们可以使用mapValues的修改版本(我相信coming in Swift 4)。我们会flatMapValues

extension Dictionary {
    func flatMapValues<T>(_ transform: (Value) throws -> T?) rethrows -> [Key: T] {
        var result: [Key: T] = [:]

        for (key, value) in self {
            if let newValue = try transform(value) {
                result[key] = newValue
            }
        }
        return result
    }
}

有了这个,我们可以完全精确,即使混合中有空列表:

interestingNumbers
    .flatMapValues { $0.max() }
    .max { $0.1 < $1.1 }?
    .key

再一次,如果你发现这一点,保罗的方法没有错,但还有其他方法可以解决这个问题。

顺便说一句,迭代的等效版本看起来像这样:

var largestNumber: Int? = nil
var largestNumberKind: String? = nil

for (kind, numbers) in interestingNumbers {
    for x in numbers {
        if largestNumber == nil || largestNumber! < x {
            largestNumber = x
            largestNumberKind = kind
        }
    }
}