Подтвердить что ты не робот

Как получить первые n элементов из Hash в ruby?

У меня есть хэш, и я его отсортировал, используя значения

@friends_comment_count.sort_by{|k,v| -v}

Теперь я хочу только получить хэш из пяти элементов. Один из способов - использовать счетчик и разбить его на 5.  Какой предпочтительный способ сделать в рубине?

Спасибо

4b9b3361

Ответ 1

h = { 'a' => 10, 'b' => 20, 'c' => 30 }

# get the first two
p Hash[*h.sort_by { |k,v| -v }[0..1].flatten]

EDITED

# get the first two (more concisely)
p Hash[h.sort_by { |k,v| -v }[0..1]]

Ответ 2

Разве вы не можете сделать что-то вроде:

h = {"test"=>"1", "test2"=>"2", "test3"=>"3"}

Тогда, если вам нужны первые 2:

p h.first(2).to_h

Результат:

=> {"test"=>"1", "test2"=>"2"}

Ответ 3

Новый рубин сам (будьте добры, если я ошибаюсь, ребята!), но работает ли это?

@friends_comment_count.sort_by{|k,v| -v}.first 5

Работает для меня в IRB, если я понял, чего вы пытаетесь достичь правильно

Ответ 4

Вы не можете сортировать хеш и что sort_by НЕ сортирует ваш хэш. Он возвращает отсортированный массив массивов.

Ответ 5

Хеши не упорядочены по своей природе (даже в Ruby-реализации). Попытайтесь преобразовать свой хэш в массив и получить [0,4] из него

Ответ 6

В Ruby 2.2.0 и более поздних версиях Enumerable#max_by берет необязательный целочисленный аргумент, который заставляет его возвращать массив вместо одного элемента. Это означает, что вы можете:

h = { 'a' => 10, 'b' => 20, 'c' => 30 }
n = 2
p h.max_by(n, &:last).to_h   # => {"b"=>20, "c"=>30}