# Array.sort with bignum fails?

I have a array with big numbers and sort method does not order it
correctly.

irb(main):017:0> a = [ “8412478247689”, “25977”, “88582”,
“8410347003107” ]
=> [“8412478247689”, “25977”, “88582”, “8410347003107”]
irb(main):018:0> a.sort
=> [“25977”, “8410347003107”, “8412478247689”, “88582”]
irb(main):019:0>

Exists some other form to order the Array?

You are using an array of strings, they are sorted alphabetically.

2008/5/18 Rg Rg [email protected]:

Looks like you are sorting strings not bignums. Therefore the sorting
is
correct.

Just wasn’t fast enough.

Thanks, now this ok.

irb(main):001:0> a = [ 8412478247689, 25977, 88582, 8410347003107 ]
=> [8412478247689, 25977, 88582, 8410347003107]
irb(main):002:0> a.sort
=> [25977, 88582, 8410347003107, 8412478247689]
irb(main):003:0>

In my code with “to_i” it’s ok:

@f.each do |linea|
cod, desc = linea.chomp.split(/,/)
@array1[i] = [ cod.strip.to_i ]
i = i+1
end
@asort1 = @array1.sort

On 18 Mai, 20:37, Rg Rg [email protected] wrote:

## Exists some other form to order the Array?

Posted viahttp://www.ruby-forum.com/.

Try using Integers instead of Strings;

a = [8412478247689, 25977, 88582, 8410347003107]
=> [8412478247689, 25977, 88582, 8410347003107]

a.sort
=> [25977, 88582, 8410347003107, 8412478247689]

Rg Rg wrote:

@f.each do |linea|
Â Â Â cod, desc = linea.chomp.split(/,/)
Â Â Â @array1[i] = [ cod.strip.to_i ]
Â Â Â i = i+1
end
@asort1 = @array1.sort

An equivalent piece of code that does the same:
@array1 = @f.map do |linea|
[ linea.to_i ]
end
@asort1 = @array1.sort

String#to_i ignores whitespace at the beginning (so you don’t need
strip) and
will stop at the first non digit (so you don’t have to remove what comes
after the comma - it will just be ignored).

Though I wonder what the purpose of the @array1 variable is and whether
it is
intended that @array1 as well as @asort1 only contain one-element
arrays.
In case @array1 has no purpose (other than holding the values to be
sorted
until they are sorted) and the one-element arrays are not wanted, this
solution would work:
@asort1 = @f.map {|line| line.to_i}.sort

HTH,
Sebastian

Sebastian H. wrote:

Rg Rg wrote:

@f.each do |linea|
cod, desc = linea.chomp.split(/,/)
@array1[i] = [ cod.strip.to_i ]
i = i+1
end
@asort1 = @array1.sort

An equivalent piece of code that does the same:
@array1 = @f.map do |linea|
[ linea.to_i ]
end
@asort1 = @array1.sort

String#to_i ignores whitespace at the beginning (so you don’t need
strip) and
will stop at the first non digit (so you don’t have to remove what comes
after the comma - it will just be ignored).

Ok

Though I wonder what the purpose of the @array1 variable is and whether
it is
intended that @array1 as well as @asort1 only contain one-element
arrays.
In case @array1 has no purpose (other than holding the values to be
sorted
until they are sorted) and the one-element arrays are not wanted, this
solution would work:
@asort1 = @f.map {|line| line.to_i}.sort

I have arrays into @array2

@array2[0] = [ 25977, “string1”, “string2” ]
@array2[1] = [ 36000, “string3”, “string4” ]
@array2[ …

My objective is to sort @array2 by numeric code and make a binary
search.
Sort it’s ok, and for binary search I use gems --> “bsearch”.
“bsearch” with simple array it’s ok, but array into array dont’t work.

This is because I make @array1 with one element.
Although surely there is some other better form.

HTH,
Sebastian

On 18 Mai, 23:56, Rg Rg [email protected] wrote:

@array1 = @f.map do |linea|

I have arrays into @array2
This is because I make @array1 with one element.
Although surely there is some other better form.

HTH,
Sebastian

Posted viahttp://www.ruby-forum.com/.

there is no “bsearch” gem, at least not in the default repos.