# Array Problem, sort Array

Discussion in 'Ruby' started by Cool Wong, Jun 28, 2007.

1. ### Cool WongGuest

Code (Text):

Array = ["a", "a", "a", "b", "b", â€œcâ€, "c", "c","d", "d", "e"]

How can i sort the array data???

[result]
Array = ["a", "b", "c", "d", "e"]
[/result]

Cool Wong, Jun 28, 2007

2. ### Cool WongGuest

if the array include the "nil", it cannot sort, why??

["a", "a", "a", "b", "b", "c", "c", "c","d", "d", "e", nil].uniq.sort

Cool Wong, Jun 28, 2007

3. ### PhrogzGuest

my_array.compact.uniq.sort

Phrogz, Jun 28, 2007
4. ### PhrogzGuest

....why wouldn't it be? Sorting an array of any 1 element should always
return a similar array.

Phrogz, Jun 28, 2007
5. ### Peña, BotpGuest

From: Phrogz [mailto:] :
# > A little digression for everyone though...
# > irb(main):013:0> [nil].sort
# > =3D> [nil]
# >
# > is that intended?
#=20
# ...why wouldn't it be? Sorting an array of any 1 element should always
# return a similar array.

it gives the impression that nil elements are sortable.

kind regards -botp

Peña, Botp, Jun 28, 2007
6. ### Cool WongGuest

Code (Text):

Array = ["a", "a", "a", "b", "b", â€œcâ€, "c", "c","d", "d", "e"]

Can i calculate the data in the Array???

a a a b b c c c d d e

For example: ArrayNumber = ["3", "2", "3", "2", "1"]

Cool Wong, Jun 28, 2007
7. ### F. SenaultGuest

Le 28 juin à 06:17, Peña, Botp a écrit :
c) Use a sort(_by) block (maybe that's what you meant in a) :
=> ["a", "b", nil]
Well, you don't need the comparison operator where there's only one
element, do you ?

Fred

F. Senault, Jun 28, 2007
8. ### Peña, BotpGuest

From: F. Senault [mailto:] :
# Le 28 juin =E0 06:17, Pe=F1a, Botp a =E9crit :
# > solution: a) convert elements to some common class (string=20
# is common)
# > b) filter those you don't want sorted (using=20
# compact/reject/..)
# > or select those you want (using select/map/..)
#=20
# c) Use a sort(_by) block (maybe that's what you meant in a) :
# >> ["a", nil, "b"].sort_by { |e| (e.nil? ? 'z' : e) }
# =3D> ["a", "b", nil]

yap, they're all the same, string comparison.

another stupid sample below. the comparison is in integers, indirectly =
handled by array#index.

shelf_order =3D [nil, "orange","spices","apple","peaches", "herbs"]
tobe_ordered =3D ["herbs", "orange","apple",nil,"peaches"]
tobe_ordered.sort_by do |e|=20
shelf_order.index(e)
end
=3D> [nil, "orange", "apple", "peaches", "herbs"]

=20
# > A little digression for everyone though...
# > irb(main):013:0> [nil].sort
# > =3D> [nil]
# >
# > is that intended?
#=20
# Well, you don't need the comparison operator where there's only one
# element, do you ?

careful with the "one" there. The array returned may be complex.
eg,
irb(main):029:0> [[nil,[nil,"a"]]].sort
=3D> [[nil, [nil, "a"]]]
irb(main):030:0> [[nil,[nil,"a"]]].flatten.sort
NoMethodError: undefined method `<=3D>' for nil:NilClass
from (irb):30:in `sort'

again, as i've said to Phrogz, the behavior hints that nil elements by =
themselves are sortable. Remember, programs contain blackboxes wc may be =
complex and not obvious, eg
complex_proc_ret_array.sort_complex.foo_proc.bar_proc

one could argue bluntly too, eg
[nil].sort
=3D>[nil] # yes, there is no need to sort
[nil,nil].sort
=3D>[nil,nil] # yes, there is no need to sort

I really value consistency of object behavior when it comes to ruby, =
maybe because it's too dynamic and i want least number of surprises =
(especially when you chain things).

Anyway, I've overlooked this behavior and now I'll have to recheck again =
my testcases

thanks Senault and Phrogz, and kind regards -botp

Peña, Botp, Jun 28, 2007
9. ### John JoyceGuest

Let's do some philosophy!
But if an array has only one element and the element is nil, is it =20
really an array?
It is an object of Class Array.
Well, it must be an array.=

John Joyce, Jun 28, 2007
10. ### Rob BiedenharnGuest

This thread continues to remind me of a comment made by a colleague =20

"When searching the linked-list, the algorithm stops at the
first match unless the list has only one element and then
it goes to the end whether or not a match is found."

-Rob

Rob Biedenharn http://agileconsultingllc.com

Rob Biedenharn, Jun 28, 2007
11. ### PhrogzGuest

Of course it's an Array. And (unlike Lua) it is an Array with exactly
1 object in it. The fact that that object happens to be a member of
NilClass is no different than objects of TrueClass or Fixnum or yet
another Array.

[nil] != []
[1,nil] != [1]
[1,nil,2] != [1,2]

It's more than the fact that Ruby thinks they're different. They have
completely different, distinct, well-defined meanings.

Phrogz, Jun 28, 2007
12. ### dblackGuest

---2049402039-258736838-1183046258=:23351
Content-Type: MULTIPART/MIXED; BOUNDARY="-2049402039-258736838-1183046258=:23351"

This message is in MIME format. The first part should be readable text,
while the remaining parts are likely unreadable without MIME-aware tools.

---2049402039-258736838-1183046258=:23351
Content-Type: TEXT/PLAIN; charset=X-UNKNOWN; format=flowed
Content-Transfer-Encoding: QUOTED-PRINTABLE

Hi --

emselves are sortable. Remember, programs contain blackboxes wc may be comp=
lex and not obvious, eg
e because it's too dynamic and i want least number of surprises (especially=
when you chain things).

class C; end
[C.new].sort

?

David

--=20
* Books:
RAILS ROUTING (new! http://www.awprofessional.com/title/0321509242)
RUBY FOR RAILS (http://www.manning.com/black)
* Ruby/Rails training
& consulting: Ruby Power and Light, LLC (http://www.rubypal.com)
---2049402039-258736838-1183046258=:23351--
---2049402039-258736838-1183046258=:23351--

dblack, Jun 28, 2007
13. ### Peña, BotpGuest

From: John Joyce [mailto:] :
# On Jun 28, 2007, at 2:41 AM, Pe=F1a, Botp wrote:
# > From: Phrogz [mailto:] :
# > # > A little digression for everyone though...
# > # > irb(main):013:0> [nil].sort
# > # > =3D> [nil]
# > # > is that intended?
# > # ...why wouldn't it be? Sorting an array of any 1 element should =20
# > always
# > # return a similar array.
# > it gives the impression that nil elements are sortable.
# Let's do some philosophy!
# But if an array has only one element and the element is nil, is it =20
# really an array?
# It is an object of Class Array.
# Well, it must be an array.

Yes, Joyce, that is the point. simple as it is.
if [nil].sort is an array, (indeed it is)
isn't [nil,nil].sort an array, too?

kind regards -botp

Peña, Botp, Jun 29, 2007
14. ### Peña, BotpGuest

On Behalf Of :
# class C; end
# [C.new].sort
# ?

or maybe,
[complex_objects].sort

i really avoid threading such complex objects to sort, though things =
like that can be handled by sort_by or plain sort{0}.

What i'm concerned at is nil, since it's one of the most common object =
returned.

But i think i see the crux here, eg

irb(main):042:0> 1 =3D=3D=3D 1
=3D> true
irb(main):043:0> 1 =3D=3D 1
=3D> true
irb(main):044:0> 1 > 1
=3D> false
irb(main):045:0> 1 < 1
=3D> false
irb(main):046:0> nil =3D=3D=3D nil
=3D> true
irb(main):047:0> nil =3D=3D nil
=3D> true
irb(main):048:0> nil > nil
NoMethodError: undefined method `>' for nil:NilClass
from (irb):48
from :0
irb(main):049:0> nil < nil
NoMethodError: undefined method `<' for nil:NilClass
from (irb):49
from :0

?
kind regards -botp

Peña, Botp, Jun 29, 2007
15. ### dblackGuest

---2049402039-2137031982-1183114646=:6116
Content-Type: MULTIPART/MIXED; BOUNDARY="-2049402039-2137031982-1183114646=:6116"

This message is in MIME format. The first part should be readable text,
while the remaining parts are likely unreadable without MIME-aware tools.

---2049402039-2137031982-1183114646=:6116
Content-Type: TEXT/PLAIN; charset=X-UNKNOWN; format=flowed
Content-Transfer-Encoding: QUOTED-PRINTABLE

Hi --

turned.

But it's a question of whether <=3D> is defined or not, so C.new is in
exactly the same position as nil. So the question is: if [C.new]
(one-element array) "sorts", why should [nil] not "sort"?

David

--=20
* Books:
RAILS ROUTING (new! http://www.awprofessional.com/title/0321509242)
RUBY FOR RAILS (http://www.manning.com/black)
* Ruby/Rails training
& consulting: Ruby Power and Light, LLC (http://www.rubypal.com)
---2049402039-2137031982-1183114646=:6116--
---2049402039-2137031982-1183114646=:6116--

dblack, Jun 29, 2007
16. ### F. SenaultGuest

Le 28 juin à 12:43, Peña, Botp a écrit :
We're in an object paradigm here. We're trying to sort an array of one
and only one object ; the nature of this object doesn't enter into the
equation. You just don't need to perform any comparisons to sort an
array of one element... or zero :
=> []

Fred

F. Senault, Jun 29, 2007
17. ### Peña, BotpGuest

On Behalf Of
#But it's a question of whether <=3D> is defined or not, so C.new is in
#exactly the same position as nil. So the question is: if [C.new]
#(one-element array) "sorts", why should [nil] not "sort"?

yes, single elements do return _regardless_. i was used to thinking =
nil-filled arrays wont sort directly. pls forgive my noise.

in general,
[anyobject].sort always return [anyobject]
but
[anyobject,anyobject].sort may or may not be defined (unless filtered =
by block)

thanks to everyone for the enlightenment.
kind regards -botp

ps: this may be for a new thread, and i should have asked this a long =
time ago, but: why no <=3D> op for nil? so [nil, nil, nil].sort =3D> =
[nil, nil, nil]

Peña, Botp, Jun 30, 2007
18. ### Peña, BotpGuest

From: F. Senault [mailto:] :
# and only one object ; the nature of this object doesn't enter into the
# equation. You just don't need to perform any comparisons to sort an
# array of one element... or zero :
indeed, thanks senault for the enlightenment. i was used to thinking =
that if my sorting routines passes, then i don't have nil objects in =
them. i totally missed the sorting algorithm for just one and only one =
element.
see my previous msg to david too.
kind regards -botp

Peña, Botp, Jun 30, 2007