2013-08-08 4 views
1

Я хочу группировать строковые элементы массива на основе содержимого.group_by строковые элементы в массиве на основе их содержимого

["abc", "abc", "def", "ghi", "ghi"].group_by { |x| some code }

Так что я хочу, чтобы вернуться:

[["abc", "abc", "abc"],["def"],["ghi", "ghi"]]

Я попытался следующие:

irb(main):065:0> ["abc", "abc", "def", "ghi", "ghi"].group_by { |x| x }

возвращает: {"abc"=>["abc", "abc"], "def"=>["def"], "ghi"=>["ghi", "ghi"]}

Что было бы лучшим способом сделать это?

+0

на основе их содержания, каким образом? Что представляют собой '0',' 1', '2'? – sawa

+0

0, 1, 2 - хеш-ключи – PericlesTheo

+0

Конечно, они есть. Что они представляют? – sawa

ответ

2

Вы просто хотите массив. Тогда вы пишете:

["abc", "abc", "def", "ghi", "ghi"].group_by { |x| x }.values 
+0

Принято для простоты – PericlesTheo

+1

@PNY: это сбивает с толку, вы выбираете ответ (который является разумным ответом), который не возвращает то, о чем вы просите. Тогда обновите вопрос. – tokland

2
class Array 
    def group 
    h_result = {} 
    self.uniq.each_with_index {|value, i| h_result[i] = self.select{|x| x==value}} 
    group = h_result 
    end 
end 

a_test = ["abc", "abc", "def", "ghi", "ghi"] 
h_test = a_test.group 

puts h_test.inspect 
+0

+1, но ответ Лукаса гораздо легче читать, даже через него не возвращается хэш, он все равно выполнит эту работу. – PericlesTheo

+0

Да, его ответ определенно намного проще :) – tigeravatar

1
a = ["abc", "abc", "def", "ghi", "ghi"] 
Hash[a.uniq.map.with_index{|e,i| [i,[e]*a.count(e)]}] 
# => {0=>["abc", "abc"], 1=>["def"], 2=>["ghi", "ghi"]} 
0

Вот глупый один лайнер, который бы получить, что вы хотите. Тем не менее, кажется, что это похоже на то, что нужно делать.

a = ["abc", "abc", "def", "ghi", "ghi"] 
Hash[a.group_by { |x| x }.values.map.with_index { |x, i| [i, x] }] 
# => {0=>["abc", "abc"], 1=>["def"], 2=>["ghi", "ghi"]} 
0

не очень просто, но это будет делать то, что вы хотите:

["abc", "abc", "def", "ghi", "ghi"].group_by{|x|x}.each_with_index.inject({}){|m,a|m[a[1]]=a[0];m} 
Смежные вопросы