开发者

Sort an Array of Strings by their Integer Values

Let's say I have an unsorted array from 1 to 10, as shown below...

a = ["3", "5", "8", "4", "1", "2", "9", "10", "7", &q开发者_运维技巧uot;6"]

If I use the sort method on this array, it returns this...

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

As you can see, the 10, appears before the 2, which is incorrect. How can I sort these numbers so that 10 appears correctly?

EDIT: Thank you all for your responses. I should explain my problem a little better. The array I need sorted is for an e-commerce price list. So the array appears as follows...

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

So the strings cannot be converted to integers. I should have put this when I wrote the question. I did not think that there would be much difference in the fix. My mistake, I apologise for making this assumption! How though can I sort this array? Thanks!


I'll throw another method out there since it's the shortest way I can think of

a.sort_by(&:to_i)


As your updated question states:

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

even geekier:

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


If you convert all strings to integers beforehand, it should work as expected:

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


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


Another option, that can be used in your example or others arrays like

a = ["teste", "test", "teste2", "tes3te", "10teste"]

is:

a.sort_by! {|s| s[/\d+/].to_i}


The reason for this behavior is that you have an array of strings and the sort that is being applied is string-based. To get the proper, numeric, sorting you have to convert the strings to numbers or just keep them as numbers in the first place. Is there a reason that your array is being populate with strings like this:

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

Rather than numbers like this:

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

?


The cheap way would be to zero fill on the left and make all numbers 2 digit.


For the special case (e-commerce price list) you mentioned

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

let's add a few more values to this array (as it was mentioned as price list). so

a = ["0-10", "11-20", "120-150", "110-120", "21-30", "31-40"]

we can sort such an array using the following

a.sort.sort_by(&:length)
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜