我的代码实际上工作但我需要打印分配给数组的第二个最大键,包含数字(16 - 这是第二大)。 我该如何访问此密钥?
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 secondLargest=0
for (kind, numbers) in interestingNumbers{
for number in numbers {
if number>largest {
secondLargest = largest
largest = number
} else if (number > secondLargest && number != largest) {
secondLargest=number
}
}
}
print( "The largest number is: \(largest) ")
print( "The second largest number is: \(secondLargest) and is a\(kind)
kind ")
你可以和Tuples一起去
let interestingNumbers = ["prime": [2,3,5,7,11,13], "fibonacci": [1,1,2,3,5,8], "square": [1,4,9,16,25]]
var largest:(key:String, number:Int) = ("",0);
var secondLargest:(key:String, number:Int) = ("",0)
for (kind, numbers) in interestingNumbers{
for number in numbers {
if number>largest.number {
secondLargest = (kind,largest)
largest = (kind, number)
} else if (number > secondLargest.number && number != largest.number) {
secondLargest= (kind,number)
}
}
}
print( "The largest number is: \(largest.number) ")
print( "The second largest number is: \(secondLargest.number) and is a\(secondLargest.key)
kind ")
这是功能解决方案:
import Foundation
import PlaygroundSupport
let interestingNumbers = ["prime": [2,3,5,7,11,13], "fibonacci": [1,1,2,3,5,8], "square": [1,4,9,16,25]]
if let secondLargest = interestingNumbers
.map({key, value in
value.map { (key, $0) }
})
.flatMap({$0})
.sorted(by: { $0.0 < $1.0})
.dropLast()
.last {
print(secondLargest)
}
我建议将一个数组中的所有数字排序为类型的元组。然后你可以得到任意数量的最大数字和他们的种类
let sortedInteresting = interestingNumbers.map { (arg: (key: String, value: [Int])) -> ([(String,Int)]) in
let (key, value) = arg
return value.map { (key, $0) }
}
.flatMap{ $0 }
.sorted { $0.1 > $1.1 }
largest = sortedInteresting.first!.1
secondLargest = sortedInteresting.dropFirst().first!.1
key = sortedInteresting.dropFirst().first!.0
这是使用forEach
和max
/ max(by:)
的解决方案
var largest = 0;
var secondLargest=0
var savedKind = ""
interestingNumbers.forEach {
if let max = $0.value.max() {
if max > largest { largest = max }
let next = $0.value.max(by: { $0 < $1 && $1 < max }) ?? -1
if next > secondLargest {
secondLargest = next
savedKind = $0.key
}
}
}
print( "The largest number is: \(largest) ")
print( "The second largest number is: \(secondLargest) and is a \(savedKind) kind ")