2010-05-07 6 views

ответ

20

Edit: Прежние версии были немного неправильно и неясными в отношении номеров версий

Начиная с версии Ruby 1.9 и 1.8.7+, метод Enumerable#max_by доступен:

@rows = arr.max_by{|a| a.length} 

max_by выполняет данный блок для каждого объекта в arr и затем возвращает тот объект, который имел наибольший результат.

В простых случаях, подобных этому, когда блок состоит только из одного имени метода и некоторого переменного шума, на самом деле нет необходимости в явном блоке. Можно использовать макияж метода Symbol#to_proc и избежать переменной блока в целом, делая это:

@rows = arr.max_by(&:length) 

В более ранних версиях Руби не хватает как #to_proc и метод #max_by. Поэтому нам нужно явно дать наше фактическое сравнение и использовать Enumerable#max.

@rows = arr.max{|c1, c2| c1.length <=> c2.length} 

Спасибо всем комментариям разъяснений.

+1

И, конечно же, с Ruby 1.8.7+, 1.9 или ActiveSupport это будет просто 'arr.max_by (&: length)'. –

+0

На самом деле, я просто понял, что 'Enumerable # max_by' в любом случае не существует в 1.8.6. –

+0

В 1.8.6 вы можете сделать 'arr.max {| a, b | a.length <=> b.length} '. –

0

Вы можете отсортировать массив по длине, а затем вытянуть самый длинный.

sorted_rows = @rows.sort{|x,y| y.length<=>x.length} 
longest_row = sorted_rows.first 

Не совсем так эффективно, но это альтернатива. Если вы не хотели использовать новый массив и не заботились о заказе в массиве @rows, вы могли бы просто использовать сортировку! метод.

1

arr.inject {| самый длинный, текущий | longest.length> current.length? longest: current}

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