2011-12-20 34 views

Trả lời

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

Bạn không cần đến biểu tượng hoặc 'flatten', chỉ cần đưa AoA vào 'Hash []': 'Hash [h.sort_by {| k, v | -v} [0..1]] ' –

+0

cảm ơn mu, chỉnh sửa – maprihoda

0

Hashes không theo lệnh của thiên nhiên (thậm chí còn nghĩ trong việc thực hiện của Ruby họ). Hãy thử chuyển đổi Hash thành Array của bạn và nhận [0,4] trong số đó

+0

bạn có chắc là họ đang ở trong Ruby không? 'sort_by' trả về một mảng –

+1

Hashes được sắp xếp theo Ruby 1.9, nhưng trong 1.8 thì không. – Linuxios

+0

@Oleg (Không thể nhập tên của bạn trên nhiều thiết bị, yanno) Có, chúng được sắp xếp theo thứ tự chèn là 1,9. –

6

Mới cho bản thân tôi (xin hãy làm ơn nếu tôi là kẻ sai!) Nhưng việc này có hiệu quả không?

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

trình cho tôi trong IRB, nếu tôi đã hiểu những gì bạn đang cố gắng để đạt được một cách chính xác

+2

Điều đó sẽ hiệu quả, nhưng kết quả là một mảng các mảng. '[[: a, 1], [: b, 2]]'. Hàm băm được chuyển đổi thành một mảng và sau đó phương thức 'first' được sử dụng trên mảng đó –

+0

@dorsel yup correct .. – harshit

+1

Nhưng bạn có thể biến mảng mảng đó trở lại thành Hash bằng cách gói nó trong' Hash [] 'như vậy: 'Hash [@ friends_comment_count.sort_by {| k, v | -v} .first 5] '. –

4

Bạn không thể sắp xếp một Hash và đó là lý do tại sao sort_by KHÔNG sắp xếp Hash của bạn. Nó trả về một mảng được sắp xếp của mảng.

0

Trong Ruby 2.2.0 trở lên, Enumerable#max_by lấy một đối số nguyên tùy chọn làm cho nó trả về một mảng thay vì chỉ một phần tử. Điều này có nghĩa bạn có thể làm:

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

thể bạn không chỉ cần làm điều gì đó như:

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

Sau đó, nếu bạn muốn là người đầu tiên 2:

p h.first(2).to_h 

Kết quả:

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

Không phải là cách hiệu quả nhất để đi về nó, đặc biệt là với băm lớn, nhưng một hack đơn giản, tốt đẹp khi bạn cần nó. – tristanm

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