Как я могу сортировать по частоте слов, а затем сортировать по алфавиту в каждой частоте в Ruby?

wordfrequency = Hash.new(0)
splitfed.each { |word| wordfrequency[word] += 1 }

wordfrequency = wordfrequency.sort_by {|x,y| y }
wordfrequency.reverse!

puts wordfrequency

Я добавил слова в хеш-таблицу и получил ее для сортировки по частоте слов, но затем порядок внутри каждой частоты является случайным, когда я хочу, чтобы он был в алфавитном порядке. Любые быстрые исправления? Спасибо! Очень признателен.


person Jack    schedule 18.11.2014    source источник
comment
Вам необходимо предоставить образцы входных данных и пример того, что вы хотите получить на выходе.   -  person the Tin Man    schedule 18.11.2014


Ответы (3)


Вы можете использовать:

wordfrequency = wordfrequency.sort_by{|x,y| [y, x] }

для сортировки по значению, затем по ключу.

В твоем случае,

splitfed = ["bye", "hi", "hi", "a", "a", "there", "alphabet"]


wordfrequency = Hash.new(0)
splitfed.each { |word| wordfrequency[word] += 1 }

wordfrequency = wordfrequency.sort_by{|x,y| [y, x] }
wordfrequency.reverse!

puts wordfrequency.inspect

выведет:

[["hi", 2], ["a", 2], ["there", 1], ["bye", 1], ["alphabet", 1]]

который находится в обратном порядке по вхождению слова, а затем самого слова.

Убедитесь, что вы заметили (что может быть довольно очевидно), что частота слов теперь является массивом.

person raph    schedule 18.11.2014
comment
Возможно, вы захотите упомянуть, что можно было бы сортировать по [-y, x] в качестве альтернативы использованию reverse!. Я удалю этот комментарий, когда вы его увидите... - person Cary Swoveland; 19.11.2014
comment
Хороший момент @CarySwoveland, но в этом случае он будет в обратном порядке по частоте, а затем в алфавитном порядке (в отличие от обратной частоты, а затем обратного алфавитного порядка). Я не уверен, о чем именно спрашивают, поэтому я думаю, что ваш комментарий следует оставить, если это то, что нужно. - person raph; 19.11.2014
comment
Я принял заявление ОП, ... но тогда порядок внутри каждой частоты является случайным, когда я хочу, чтобы он был в алфавитном порядке, ... что означает, что связи должны быть упорядочены в алфавитном порядке. - person Cary Swoveland; 19.11.2014

Хэши не обязательно сортируются в естественном порядке; это зависит от индивидуальной структуры данных. Если вы хотите красиво напечатать хеш, вам нужно отсортировать ключи, а затем выполнить итерацию по этому отсортированному списку ключей, выводя значение для каждого ключа по мере продвижения.

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

Некоторые хэши сохраняют порядок вставки, некоторые хэши сохраняют отсортированную структуру, которую вы затем можете просматривать при обработке хэша, но это исключения из правила.

person mcfinnigan    schedule 18.11.2014

Ruby group_by является основой для этого:

words = %w[foo bar bar baz]
words.group_by{ |w| w } 
# => {"foo"=>["foo"], "bar"=>["bar", "bar"], "baz"=>["baz"]}

words.group_by{ |w| w }.map{ |k, v| [k, v.size ] } 
# => [["foo", 1], ["bar", 2], ["baz", 1]]

Если вы хотите отсортировать по словам, то по их частоте:

words.group_by{ |w| w }.map{ |k, v| [k, v.size ] }.sort_by{ |k, v| [k, v] } 
# => [["bar", 2], ["baz", 1], ["foo", 1]]

Если вы хотите отсортировать по частоте, то по словам:

words.group_by{ |w| w }.map{ |k, v| [k, v.size ] }.sort_by{ |k, v| [v, k] } 
# => [["baz", 1], ["foo", 1], ["bar", 2]]
person the Tin Man    schedule 18.11.2014