Свифт 4.2 / 5. получить «ключ» числа в массиве, который назначен этому ключу в словаре - PullRequest
0 голосов
/ 12 апреля 2019

Мой код на самом деле работает, но мне нужно напечатать ключ secondLargest, который назначен массиву, в котором содержится число (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 ")

Ответы [ 4 ]

0 голосов
/ 12 апреля 2019

Вот решение с использованием 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 ")
0 голосов
/ 12 апреля 2019

Вот функциональное решение:

  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 голосов
/ 12 апреля 2019

Предлагаю отсортировать все числа в одном массиве как кортежи с их видом.Тогда вы можете получить любое количество самых больших чисел и их вид

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 голосов
/ 12 апреля 2019

Вы можете пойти с кортежами

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 ")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...