2011-10-11 64 views
15

Hãy nói rằng tôi có một mảng không được phân loại từ 1 đến 10, như hình dưới đây ...Sắp xếp một mảng của chuỗi bằng Integer họ Values ​​

a = ["3", "5", "8", "4", "1", "2", "9", "10", "7", "6"] 

Nếu tôi sử dụng phương pháp sắp xếp trên mảng này, nó sẽ trả này ...

a.sort = ["1", "10", "2", "3", "4", "5", "6", "7", "8", "9"] 

Như bạn có thể thấy, số 10, xuất hiện trước 2, không chính xác. Làm thế nào tôi có thể sắp xếp những con số này để 10 xuất hiện chính xác?

EDIT: Xin chào các bạn, cảm ơn tất cả các bạn đã trả lời. Tôi nên giải thích vấn đề của tôi tốt hơn một chút. Mảng tôi cần sắp xếp là dành cho danh sách giá thương mại điện tử. Vì vậy, mảng xuất hiện như sau ...

a = ["0-10", "11-20", "21-30", "31-40" etc.] 

Vì vậy, các chuỗi không thể được chuyển đổi thành số nguyên. Tôi nên đặt nó khi tôi viết câu hỏi. Tôi không nghĩ rằng sẽ có nhiều sự khác biệt trong bản sửa lỗi. Sai lầm của tôi, tôi xin lỗi vì đã đưa ra giả định này! Làm thế nào tôi có thể sắp xếp mảng này? Cảm ơn!

+0

Tôi nghĩ rằng câu hỏi này đã được trả lời: http://stackoverflow.com/questions/1955646/sort-strings-and-numbers-in-ruby/1964686#1964686 –

+0

Chỉ cần đăng một câu trả lời cho cập nhật của bạn question – apneadiving

+0

Tôi khuyên bạn nên đăng câu hỏi mới với mô tả cập nhật vì tất cả các câu trả lời đều dựa trên mô tả sai. –

Trả lời

43

tôi sẽ ném một phương pháp khác ngoài kia vì đó là con đường ngắn nhất tôi có thể nghĩ đến

a.sort_by(&:to_i) 
+0

Điều này tương đương với câu trả lời của bricker, vì vậy nhận xét của ông về số lần 'to_i' được gọi là so với giải pháp của Matt áp dụng ở đây là tốt. –

+0

Điều này cũng xử lý phiên bản đã chỉnh sửa của câu hỏi. –

+0

'&:' là gì? Đó là một cú pháp mới với tôi. – nipponese

6
a.sort { |a,b| a.to_i <=> b.to_i } 
+3

sử dụng Enumerable # sort_by thay vì – tokland

+0

Tại sao? Phương thức sắp xếp hoạt động hoàn hảo, tôi muốn biết lý do bạn đề nghị sort_by. – bricker

+7

Theo định nghĩa xs.sort {| a, b | a.method <=> b.method} hoàn toàn tương đương với xs.sort_by (&: method).Tại sao lại sử dụng sắp xếp khi bạn có một bản dựng sẵn ngắn hơn được thiết kế chính xác cho tác vụ này? Nếu đó là không đủ, cũng có lý do hiệu suất, c & p từ các tài liệu: "Như của Ruby 1.8, phương pháp Enumerable # sort_by thực hiện một xây dựng trong Schwartzian Transform, hữu ích khi tính toán chính hoặc so sánh là tốn kém." – tokland

0

Cách rẻ tiền sẽ là không điền vào bên trái và làm cho tất cả các số có 2 chữ số.

+3

Giá rẻ và cách tốt nhất là sắp xếp chúng dưới dạng số nguyên thay vì chuỗi. – bricker

1

Lý do cho hành vi này là bạn có một chuỗi các chuỗi và sắp xếp đang được áp dụng là dựa trên chuỗi. Để có được đúng, số, phân loại bạn phải chuyển đổi chuỗi thành số hoặc chỉ giữ chúng dưới dạng số ở vị trí đầu tiên. Có một lý do mà mảng của bạn đang được cư với chuỗi như thế này:

a = ["3", "5", "8", "4", "1", "2", "9", "10", "7", "6"] 

Thay vì con số như thế này:

a = [3, 5, 8, 4, 1, 2, 9, 1, 7, 6] 

?

+0

Vui lòng xem chỉnh sửa của tôi, cảm ơn bạn – tob88

6

Nếu bạn chuyển đổi tất cả các chuỗi để nguyên trước đó, nó sẽ làm việc như mong đợi:

a.map(&:to_i).sort 
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
+0

Không thực sự quan trọng đối với một mảng nhỏ như vậy, nhưng phương pháp của bạn sẽ nhanh hơn so với mảng lớn của tôi, gọi to_i chỉ bằng một nửa số lần. +1 – bricker

+1

@bricker Phương thức của Matt cũng sử dụng nhiều bộ nhớ hơn vì nó tạo ra một mảng mới với 'map' mà phương thức của bạn không sử dụng. (Bạn có thể sử dụng bản đồ tại chỗ “bản đồ!”, Nhưng điều đó có thể không phải lúc nào cũng là một lựa chọn khả thi trong mã của bạn) –

+0

Điểm tốt @WizardofOgz +1 – bricker

8

Khi câu hỏi được cập nhật của bạn nêu rõ:

array.sort_by {|elt| ary = elt.split("-").map(&:to_i); ary[0] + ary[1]} 

thậm chí geekier:

array.sort_by {|elt| ary = elt.split("-").map(&:to_i).inject(&:+)} 
+2

Vâng! Điểm thưởng cho geeky! :) – Thom

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