斯威夫特4.2 / 5。获取在Dictionary中分配给此键的数组中的数字'key'

问题描述 投票:0回答:4

我的代码实际上工作但我需要打印分配给数组的第二个最大键,包含数字(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 ")
swift
4个回答
0
投票

你可以和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 ")

0
投票

这是功能解决方案:

  1. 将每个数组映射到(键,值)元组的数组中
  2. 将生成的数组数组展平为单个(键,值)元组数组
  3. 按每个元组的值对列表进行排序
  4. 删除最大的项目
  5. 第二大项目现在是最后一项
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)
}

0
投票

我建议将一个数组中的所有数字排序为类型的元组。然后你可以得到任意数量的最大数字和他们的种类

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

0
投票

这是使用forEachmax / 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 ")
© www.soinside.com 2019 - 2024. All rights reserved.