Ruby способ группировать анаграммы в массиве строк

Я реализовал функцию для группировки анаграмм. В двух словах:

ввод: ['машины', 'за', 'картошка', 'ракс', 'четыре', 'шрам', 'кремы', крик']

вывод: [["тачки", "racs", "шрам"], ["четыре"], ["для"], ["картошка"],["сливки", "крик"]]

Я хотел бы знать, есть ли лучший способ сделать это. Я действительно думаю, что использовал слишком много операторов повторения: until, select, delete_if. Есть ли способ объединить операторы select и delete_if? Это означает, что выбранные элементы могут быть автоматически удалены?

Код:

def group_anagrams(words)
  array = []
  until words.empty? 
    word = words.first
    array.push( words.select { |match| word.downcase.chars.sort.join.eql?(match.downcase.chars.sort.join ) } )
    words.delete_if { |match| word.downcase.chars.sort.join.eql?(match.downcase.chars.sort.join ) }
  end
  array
end

Заранее спасибо,


person alexandrecosta    schedule 10.03.2012    source источник
comment
возможный дубликат Ruby Anagram с использованием String#sum   -  person Mark Thomas    schedule 10.03.2012


Ответы (2)


Как это:

 a = ['cars', 'for', 'potatoes', 'racs', 'four','scar', 'creams', 'scream']
 a.group_by { |element| element.downcase.chars.sort }.values

Выход:

[["cars", "racs", "scar"], ["for"], ["potatoes"], ["four"], ["creams", "scream"]]

Если вы хотите, вы можете, конечно, превратить этот однострочный метод в метод.

person Boris Strandjev    schedule 10.03.2012
comment
Правило №1 программирования на Ruby: изучите методы Enumerable. Правило №2: см. Правило №1. :-) - person Jörg W Mittag; 10.03.2012
comment
Странно, что это работает на моей машине, но не в героку! Мой сайт отключается, когда у меня есть это на героку... - person alexandrecosta; 16.03.2012
comment
Когда я запускаю это, я получаю только: - person n as; 21.05.2014