Ruby: Как найти индекс элемента минимального массива? Есть ли способ переписать это более элегантно? Я думаю, что это плохая часть кода и должна быть реорганизована. >> a = [2, 4, 10, 1, 13] => [2, 4, 10, 1, 13] >> index_of_minimal_value_in_array = a.index(a.min) => 3 Ответ 1 Было бы интересно прочитать о других ситуациях (найти все и только последний минимальный элемент). ary = [1, 2, 1] # find all matching elements' indexes ary.each.with_index.find_all{ |a,i| a == ary.min }.map{ |a,b| b } # => [0, 2] ary.each.with_index.map{ |a, i| (a == ary.min) ? i : nil }.compact # => [0, 2] # find last matching element index ary.rindex(ary.min) # => 2 Ответ 2 Я считаю, что это будет проходить массив только один раз и все еще легко читать: ary = [2,3,4,5,1] # => [2,3,4,5,1] ary.each_with_index.min # => [1, 4] # where 1 is the element and 4 is the index Ответ 3 Это перемещает массив только один раз, тогда как ary.index(ary.min) будет пересекать его дважды: ary.each_with_index.inject(0){ |minidx, (v,i)| v < a[minidx] ? i : minidx } Ответ 4 Мне действительно нравится @andersonvom answer, ему нужно только один раз заколить массив и по-прежнему получить индекс. И если вы не хотите использовать ary.each_with_index.min, вот что вы можете сделать: ary = [2,3,4,5,1] # => [2,3,4,5,1] _, index_of_minimal_value_in_array = ary.each_with_index.min # => [1, 4] index_of_minimal_value_in_array # => 4
Ответ 1 Было бы интересно прочитать о других ситуациях (найти все и только последний минимальный элемент). ary = [1, 2, 1] # find all matching elements' indexes ary.each.with_index.find_all{ |a,i| a == ary.min }.map{ |a,b| b } # => [0, 2] ary.each.with_index.map{ |a, i| (a == ary.min) ? i : nil }.compact # => [0, 2] # find last matching element index ary.rindex(ary.min) # => 2
Ответ 2 Я считаю, что это будет проходить массив только один раз и все еще легко читать: ary = [2,3,4,5,1] # => [2,3,4,5,1] ary.each_with_index.min # => [1, 4] # where 1 is the element and 4 is the index
Ответ 3 Это перемещает массив только один раз, тогда как ary.index(ary.min) будет пересекать его дважды: ary.each_with_index.inject(0){ |minidx, (v,i)| v < a[minidx] ? i : minidx }
Ответ 4 Мне действительно нравится @andersonvom answer, ему нужно только один раз заколить массив и по-прежнему получить индекс. И если вы не хотите использовать ary.each_with_index.min, вот что вы можете сделать: ary = [2,3,4,5,1] # => [2,3,4,5,1] _, index_of_minimal_value_in_array = ary.each_with_index.min # => [1, 4] index_of_minimal_value_in_array # => 4