2012-03-10 36 views
7

Tôi đã thực hiện một hàm để nhóm đảo chữ cái. Tóm lại:Cách Ruby để nhóm đảo chữ cái trong mảng chuỗi

đầu vào: [ 'xe', 'cho', 'khoai tây', 'RACS', 'bốn', 'vết sẹo', 'kem', hét lên ']

đầu ra: [ ["xe hơi", "rac", "vết sẹo"], ["bốn"], ["cho"], ["khoai tây"], ["kem", "hét"]]

Tôi muốn biết nếu có một cách tốt hơn để làm điều này. Tôi thực sự nghĩ rằng tôi đã sử dụng quá nhiều câu nói lặp lại: until, select, delete_if. Có cách nào để kết hợp câu hỏi selectdelete_if không? Điều đó có nghĩa là, các mục đã chọn có thể tự động bị xóa không?

Code:

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 

Cảm ơn trước,

+0

có thể trùng lặp của [Ruby Anagram Using String # sum] (http://stackoverflow.com/questions/9517745/ruby-anagram-using-stringsum) –

Trả lời

35

Giống như rằng:

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

Output là:

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

Nếu bạn muốn, bạn có thể tắt chức năng này một liner đến một phương pháp tất nhiên .

+6

Quy tắC# 1 về lập trình Ruby: tìm hiểu các phương pháp của 'Số đếm' . Quy tắC# 2: xem Quy tắc số 1. :-) –

+0

Điều kỳ lạ của nó là nó hoạt động trên máy tính của tôi, nhưng không phải trong heroku! Trang web của tôi đi xuống khi tôi có điều này trên heroku ... – alexandrecosta

+0

Khi tôi chạy điều này, tôi chỉ nhận được: –

0

Bạn có thể sử dụng chức năng partition thay vì lựa chọn, thực hiện trong Enumerable. Nó chia tách các mục trong mảng theo chức năng quyết định thành hai mảng.

def group_anagrams(words) 
    array = [] 
    until words.empty? 
    word = words.first 
    delta, words = words.partition { |match| word.downcase.chars.sort.join.eql?(match.downcase.chars.sort.join) }) 
    array += delta 
    end 
    array 
end 

(chưa được kiểm tra)

Các vấn đề liên quan