2012-02-05 31 views
18

Vì vậy, tôi đã xây dựng một mảng tùy chỉnh của người sử dụng như ví dụ:sử dụng sort_by trong ruby ​​(cho đường ray)?

[["user1",432],["user1",53],["user9",58],["user5",75],["user3",62]] 

Tôi muốn sắp xếp chúng theo giá trị 2n'd trong từng mảng, từ lớn nhất đến nhỏ nhất. Tôi có một cảm giác sử dụng loại hoặc sort_by cho mảng là cách để làm điều này, nhưng tôi không thực sự chắc chắn làm thế nào để thực hiện nó

Trả lời

39

sort_by

Nếu bạn quan tâm trong sort_by, bạn có thể destructure mảng bên trong của bạn

array.sort_by { |_, x| x }.reverse 

hoặc gọi tổng đài chỉ số

array.sort_by { |x| x[1] }.reverse 

Thay vì đảo ngược, bạn có thể từ chối các giá trị được trả lại từ khối.

array.sort_by { |_, x| -x } 
array.sort_by { |x| -x[1] } 

Một giải pháp thay thế khác là sử dụng ampersandArray#last.

array.sort_by(&:last).reverse 

loại

Một giải pháp sử dụng sort có thể

array.sort { |x, y| y[1] <=> x[1] } 
+0

+1 cho các giải pháp khác nhau :) –

+3

Nếu bạn đang đi cho đầy đủ sau đó bạn có thể muốn bao gồm 'array.sort_by (&: last) .reverse'. –

+1

và chưa đầy đủ, bạn nên thêm đơn giản 'array.sort_by {| u, uid | -uid} '. Ngoài ra, lưu ý rằng nó có thể được hưởng lợi từ việc sử dụng 'Đảo ngượC# reverse_each' cho một sự đảo ngược không gian hiệu quả hơn (khi một điều tra viên phù hợp, tất nhiên). – tokland

2

sử dụng này: array.sort_by { |a| -a[1] }

+0

Tôi đã luôn luôn xếp hình bằng 'sort_by' không có tùy chọn ngược lại. – tokland

+0

chọn nitro: giải nén các đối số khối được coi là thành ngữ hơn khi truy cập chúng dưới dạng mảng. – tokland

0

Thêm một giải pháp cho sort_by ngược (- không hoạt động trong mọi trường hợp, nghĩ sắp xếp theo chuỗi):

class Invertible 
    include Comparable 
    attr_reader :x 

    def initialize(x) 
    @x = x 
    end 

    def <=> (x) 
    x.x <=> @x 
    end 
end 

class Object 
    def invertible 
    Invertible.new(self) 
    end 
end 

[1, 2, 3].sort_by(&:invertible) #=> [3, 2, 1] 
["a", "b", "c"].sort_by(&:invertible) #=> ["c", "b", "a"] 

Nó chậm hơn so với đảo ngược trong ca đơn giản se, nhưng có thể hoạt động tốt hơn với các loại phức tạp:

objs.sort_by do |obj| 
    [obj.name, obj.date.invertible, obj.score, ...] 
end 
Các vấn đề liên quan