[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Question about array.each{|x| delete x}

Frisco Del Rosario

4/24/2008 9:04:00 AM

myArray = [1, 2, 3]

puts myArray

myArray.each {|x|
if x == 1
then puts "one"
elsif x == 2
then
myArray.delete x
elsif x == 3
then puts "three"
end
}

puts myArray

The output of the above is:
1
2
3
one
1
3

And my question is "why isn't it 1 2 3 one three 1 3?". What if I wanted
to make it so?
3 Answers

Peña, Botp

4/24/2008 9:56:00 AM

0

From: Frisco Del Rosario [mailto:frisco@appleisp.netNO]=20
# "why isn't it 1 2 3 one three 1 3?".=20

a delete (of some element) on an array will really be deleted, ergo, the =
elements will rearrange/move to logically occupy that deleted space.

eg,
b=3D[1,2,3,4,5]
#=3D> [1, 2, 3, 4, 5]
b.delete 2
#=3D> 2
b
#=3D> [1, 3, 4, 5]

also, array#delete(obj) will delete all elements eql to obj. see below.=20
now, if you combine these behaviours while walking the array itself, =
expect some surprises if you're not ready :)

maybe if you show the index, ruby can help you, eg

a=3D[1,2,3,1,1,4]
#=3D> [1, 2, 3, 1, 1, 4]
a.each_with_index{|x,i| a.delete x if x=3D=3D1; puts "#{i} -> #{x}"}
0 -> 1
1 -> 3
2 -> 4
#=3D> [2, 3, 4]


# What if I wanted to make it so?

there are many better ways, but i will just modify your sample,

myArray =3D [1, 2, 3]
puts myArray
myArray.delete 2 #here i delete 2 first
myArray.each {|x|
if x =3D=3D 1
then puts "one"
elsif x =3D=3D 3
then puts "three"
end
}
puts myArray

1
2
3
one
three
1
3

kind regards -botp

tragomaskhalos

4/24/2008 11:06:00 AM

0

On Apr 24, 10:04 am, Frisco Del Rosario <fri...@appleisp.netNO> wrote:
> myArray = [1, 2, 3]
>
> puts myArray
>
> myArray.each {|x|  
> if x == 1
>   then puts "one"
>   elsif x == 2
>     then
>     myArray.delete x
>   elsif x == 3
>     then puts "three"
>   end  
>   }
>
> puts myArray
>
> The output of the above is:
> 1
> 2
> 3
> one
> 1
> 3
>
> And my question is "why isn't it 1 2 3 one three 1 3?". What if I wanted
> to make it so?

I just dup, like this:
myArray.dup.each {|x| ... delete from (original) myArray in
here .... }

I'm sure there are more elegant solutions, and it's a bit pants from a
performance perspective for large arrays, but it works for me.

Robert Klemme

4/24/2008 9:16:00 PM

0

On 24.04.2008 11:56, Peña wrote:
> From: Frisco Del Rosario [mailto:frisco@appleisp.netNO]
> # "why isn't it 1 2 3 one three 1 3?".
>
> a delete (of some element) on an array will really be deleted, ergo, the elements will rearrange/move to logically occupy that deleted space.
>
> eg,
> b=[1,2,3,4,5]
> #=> [1, 2, 3, 4, 5]
> b.delete 2
> #=> 2
> b
> #=> [1, 3, 4, 5]
>
> also, array#delete(obj) will delete all elements eql to obj. see below.
> now, if you combine these behaviours while walking the array itself, expect some surprises if you're not ready :)
>
> maybe if you show the index, ruby can help you, eg
>
> a=[1,2,3,1,1,4]
> #=> [1, 2, 3, 1, 1, 4]
> a.each_with_index{|x,i| a.delete x if x==1; puts "#{i} -> #{x}"}
> 0 -> 1
> 1 -> 3
> 2 -> 4
> #=> [2, 3, 4]
>
>
> # What if I wanted to make it so?
>
> there are many better ways, but i will just modify your sample,
>
> myArray = [1, 2, 3]
> puts myArray
> myArray.delete 2 #here i delete 2 first
> myArray.each {|x|
> if x == 1
> then puts "one"
> elsif x == 3
> then puts "three"
> end
> }
> puts myArray
>
> 1
> 2
> 3
> one
> three
> 1
> 3
>
> kind regards -botp
>

Well, you can as well do

myArray = [1, 2, 3]

puts myArray

myArray.delete_if {|x|
if x == 1 then
puts "one"
elsif x == 2 then
true
elsif x == 3 then
puts "three"
end
}

puts myArray

Note, this works because puts returns nil. :-)

But I'd prefer using case

myArray.delete_if do |x|
case x
when 1
puts "one"
when 2
true
when 3
puts "three"
end
end

Cheers

robert