2011-12-20 5 views
26

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

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

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

Благодаря

ответ

28
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

Вам не нужен splat или 'flatten', просто подайте AoA на' Hash [] ':' Hash [h.sort_by {| k, v | -v} [0..1]] ' –

+0

thanks mu, отредактировано – maprihoda

0

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

+0

Вы уверены, что находитесь в Ruby? 'sort_by' возвращает массив –

+1

Хэши упорядочены с Ruby 1.9, но в 1.8 они не были. – Linuxios

+0

@Oleg (Невозможно ввести свое имя на большом количестве устройств, yanno) Да, они упорядочены по порядку вставки с 1,9. –

6

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

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

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

+2

Это будет работать, но результатом будет массив массивов. '[[: А, 1], [: Ь, 2]]'. Хэш преобразуется в массив, а затем метод 'first' используется для этого массива –

+0

@dorsel yup correct .. – harshit

+1

Но вы можете превратить этот массив массивов обратно в хэш, завернув его в' Hash [] 'следующим образом: 'Hash [@ friends_comment_count.sort_by {| к, v | -v}. первый 5]. –

4

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

0

В 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} 
13

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

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

Затем, если вы хотели первый 2:

p h.first(2).to_h 

Результат:

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

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

Смежные вопросы