2017-02-10 2 views
0

Я пытаюсь получить наибольшее значение в словаре массивов, и мне также нужно получить ключ этого массива.Как получить наибольшее значение из целочисленного массива в словаре массивов

Это, как я получаю наибольшее значение:

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 

for (kind, numbers) in interestingNumbers { 
    for number in numbers { 
     if number > largest { 
      largest = number 
     } 
    } 
} 

ответ

0
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 largest_kind : String? =nil 
for (kind, numbers) in interestingNumbers { 
    for number in numbers { 
     if number > largest { 
      largest = number 
      largest_kind = kind 
     } 
    } 
} 
1

Вы можете использовать Swift функции для этого.

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

if let value = interestingNumbers.map ({ ($0, $1.max() ?? 0) }).max(by: { $0.1 < $1.1 }) { 
    print(value.0, value.1) // Square 25 
} 

Давайте идти с шагом за шагом

Сначала я создал массив tuple с типом [(String, Int)], с первым местом он будет хранить группу и на втором месте она будет хранить максимальное значение из соответствующей матрицы ,

let array = interestingNumbers.map ({ ($0, $1.max() ?? 0) }) 
//[("Fibonacci", 8), ("Square", 25), ("Prime", 13)] 

Теперь найти максимальное Int из массива кортежа.

if let value = array.max(by: { $0.1 < $1.1 }) { 
    print(value.0, value.1) //Will print group here it is "Square 25" 
} 
+1

Простые и элегантные :) –

+0

@IvensDenner Благодаря спариванию :) –

0

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

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

var largest: (kind: String?, number: Int) = (nil, 0) 

for (kind, numbers) in interestingNumbers { 
    for number in numbers { 
     if number > largest.number { 
      largest = (kind, number) 
     } 
    } 
} 

который может быть дополнительно упрощен до:

var largest: (kind: String?, number: Int) = (nil, 0) 

for (kind, numbers) in interestingNumbers { 
    let max = numbers.max() ?? 0 
    if max > largest.number { 
     largest = (kind, max) 
    } 
} 

Другого метода для выравнивания значений сначала в (kind, number) последовательности:

let flattened = interestingNumbers 
    .map { (kind, numbers) in numbers.map { (kind, $0) } } 
    .joined() 

let largest = flattened.max(by: { $0.1 < $1.1}) 
print(largest) 

или вы можете понимать, что только максимальное значение в каждом массиве является наиболее важным, поэтому:

let largestPerKind = interestingNumbers 
    .map { (kind, numbers) in (kind, numbers.max() ?? 0) } 

let largest = largestPerKind.max(by: { $0.1 < $1.1}) 
print(largest) 
+0

довольно прямо вперед спасибо. хотя я не понимаю, что происходит в методе сглаживания, который вы указали ... –

+0

@ Timi.O Первый шаг генерирует массив массивов из 2-х кортежей '[[(« Prime », 2), (« Prime », , 3), ...], [(«Фибоначчи», 1), («Фибоначчи», 1) ...], ...] ', вызов (' .joined() ') сглаживает его в один плоский массив '[(« Prime », 2), (« Prime », 3), ..., (« Фибоначчи », 1), (« Фибоначчи », 1) ...] – Sulthan

0

Я хотел бы использовать максимальный метод в словарных значений и получить максимальное значение из полученных значений кортежей:

if let result = interestingNumbers.max(by: {$0.value.max() ?? 0 < $1.value.max() ?? 0}), 
    let maxValue = result.value.max() { 
    print(result.key) // "Square\n" 
    print(result.value) // "[1, 4, 9, 16, 25]\n" 
    print(maxValue)  // 25 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^