2011-08-11 88 views
18

Ok, giả sử tôi có một mảng như vậy [[z, 1], [d, 3], [e, 2]], làm cách nào để sắp xếp mảng này theo thứ hai phần tử của mỗi mảng cấu thành? Vì vậy, mảng của tôi sẽ trông giống như sau? [[z, 1], [e, 2], [d, 3]]?Sắp xếp mảng hai chiều theo giá trị thứ hai

+2

Lưu ý rằng đây thực sự là mảng mảng, không phải mảng 2 chiều. – Phrogz

+0

có thể trùng lặp của [Sắp xếp một tập hợp các đối tượng theo số (cao nhất trước) sau đó bằng chữ cái (chữ cái)] (http://stackoverflow.com/questions/2232470/sort-a-collection-of-objects-by-number- cao nhất-trước-sau-chữ-chữ cái) –

Trả lời

33
arr = [[:z,1], [:d,3], [:e,2]] 
arr.sort {|a,b| a[1] <=> b[1]} 
# => [[:z, 1], [:e, 2], [:d, 3]] 

Hoặc là người dùng @Phrogz chỉ ra, nếu các mảng nội có chính xác hai yếu tố mỗi:

arr.sort_by{|x,y|y} # => [[:z, 1], [:e, 2], [:d, 3]] 
arr.sort_by(&:last) # => [[:z, 1], [:e, 2], [:d, 3]] 
+12

Hoặc đơn giản hơn: 'arr.sort_by {| s, n | n} 'hoặc thậm chí' arr.sort_by (&: last) '(trong Ruby 1.9). – Phrogz

+1

'arr.sort_by (&: last)' cũng hoạt động trong Ruby 1.8.7. –

+0

@Phrogz Ưu tiên 'sắp xếp' vì trong ruby ​​2.4 (kể từ 2.0 trong thực tế hoặc thậm chí trước đây)' sort_by' không tồn tại nhưng chỉ 'sort_by!' Và [doc] (https://ruby-doc.org/ core-2.4.0/Array.html # method-i-sort_by-21) nói rằng: _Kết quả không được đảm bảo là ổn định. Khi hai khóa bằng nhau, thứ tự của các phần tử tương ứng là không thể đoán trước._ Vì vậy, để sử dụng 'sort_by!', Bạn phải có các khóa uniq. Vì vậy, @ nghệ thuật xin vui lòng chỉnh sửa bài viết của bạn để nói rằng hoặc loại bỏ 'sort_by'. – noraj

0

Như maerics người dùng trả lời nó cung cấp Tăng dần sorting.This Câu trả lời là rất hữu ích cho tôi nhờ. Để sắp xếp giảm dần tôi sử dụng -

arr = [[:z,1], [:d,3], [:e,2]] 
arr.sort {|a,b| a[1] <=> b[1]}.reverse 
#=> [[:d, 3], [:e, 2], [:z, 1]] 
+0

Bạn có thể lưu cuộc gọi "đảo ngược" bằng cách đơn giản thực hiện 'arr.sort {| a, b || b [1] <=> a [1]} '(lưu ý thứ tự đảo ngược của toán hạng của toán tử so sánh). – maerics

+1

bạn có lỗi đánh máy trong mã của mình, mã chính xác là 'arr.sort {| a, b | b [1] <=> a [1]} '. bạn đã chèn một ký tự ống quá nhiều – Fred

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