2016-01-10 3 views
0

У меня есть 2D массив:Возврат максимум 2D массива

[["user1", 20], ["user2", 30], ["user3", 10]] 

Первый элемент подмассива является имя пользователя, а второй один его счет.

Мне нужно вернуть имя пользователя с максимальным счетом. Например, здесь он вернет "user2".

Любой пользователь имеет более высокий балл, или все они имеют одинаковый балл (в этом случае он должен возвращать "all").

Я знаю, как это сделать с кучей итераций и многих строк кода, но я пытаюсь найти «способ наилучшей практики».

Что бы вы посоветовали?

+1

Что такое 'user' в этом контексте -' [ "user1", 20] или ' "user1"'? И является номером пользователя номер внутри строки (то есть '1' в' 'user1" ') или второй элемент (т. Е.' 20' в '[" user1 ", 20]')? При этом я бы посоветовал использовать пользовательский класс 'User' с атрибутами': name' и ': number' или хотя бы хэш вместо массива. – Stefan

+0

первым элементом подмассива является имя пользователя, а второе - его оценка. Число - это второй элемент подмассива. –

+0

Почему downvote? –

ответ

6

Заканчивать max_by

users = [["user1", 20], ["user2", 30], ["user3", 10]] 

users.max_by{ |user, weight| weight } 
#=> ["user2", 30] 

# shorthand 
users.max_by(&:last) 
#=> ["user2", 30] 

users.max_by(&:last).first 
#=> "user2" 

Это стоит отметить, что если у вас есть несколько максимумов он будет возвращать только первый.

1

Простое решение для данного примера:

a = [["user1", 20], ["user2", 30], ["user3", 10]] 
h = Hash[a].invert 
h[h.keys.max] 
#=> "user2" 

В общем случае, где будет происходить одинаковые максимальное число, следующее решение будет возвращать все пользователи обмена же максимальное значение (вес/функцию инвертный Найджелом, см Swapping keys and values in a hash):

class Hash 
    def safe_invert 
    self.each_with_object({}) { |(key, value), out| (out[value] ||= []) << key } 
    end 
end 

a = [["user1", 20], ["user2", 30], ["user3", 10], ["user4", 30]] 
h = Hash[a].safe_invert 
h[h.keys.max] 
#=> ["user2", "user4"] 
Смежные вопросы