2012-11-04 29 views
6

thể trùng lặp:
Sorting an array in descending order in Rubycủa Ruby loại mảng với điều kiện theo thứ tự ngược

Tôi muốn sắp xếp một loạt các yếu tố dựa trên một số điều kiện, ngoại trừ theo thứ tự ngược. Vì vậy, về cơ bản bất cứ điều gì nó đã có thể làm và sau đó đảo ngược.

Vì vậy, ví dụ tôi có một mảng các chuỗi và tôi muốn sắp xếp nó bằng cách giảm chiều dài chuỗi

a = ["test", "test2", "s"] 
a.sort_by!{|str| str.length}.reverse! 

Trong khi điều này không được công việc ... là có một cách để xác định các điều kiện như vậy mà phân loại thuật toán sẽ làm điều đó ngược lại?

Trả lời

21

Chiều dài là một con số, do đó bạn chỉ có thể phủ nhận nó để đảo ngược thứ tự:

a.sort_by! { |s| -s.length } 

Nếu bạn đang sắp xếp trên một cái gì đó không dễ dàng phủ nhận sau đó bạn có thể sử dụng sort! và tự đảo ngược so sánh . Ví dụ, thông thường bạn muốn làm điều này:

# shortest to longest 
a.sort! { |a,b| a.length <=> b.length } 

nhưng bạn có thể trao đổi thứ tự để đảo ngược phân loại:

# longest to shortest 
a.sort! { |a,b| b.length <=> a.length } 
+0

Ồ, đó là một mẹo hay! – MxyL

+1

+1 để nhập nhanh hơn tôi: P – Thilo

+1

Hiệu suất thông minh này tốt hơn (và ngữ nghĩa hơn nếu bạn hỏi tôi): 'a.sort_by (&: length) .reverse' – Mosselman

6

Câu trả lời từ @mu là quá ngắn là rất tốt, nhưng chỉ hoạt động cho số. Đối với trường hợp chung, bạn có thể sử dụng phương thức sort:

irb> a = ["foo", "foobar", "test"] 
    => ["foo", "foobar", "test"] 
irb> a.sort{|a,b| a.length <=> b.length} 
=> ["foo", "test", "foobar"] 
irb> a.sort{|a,b| b.length <=> a.length} 
=> ["foobar", "test", "foo"] 
+0

Meh, anh ấy gõ nhanh hơn ... :) – Thilo

+4

'sort_by (&: length) .reverse' sẽ dễ đọc hơn và nhanh hơn. –

+0

Tôi đồng ý, nhưng đó không phải là câu hỏi. – Thilo

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