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

F

Frisco Del Rosario

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?
 
P

Peña, Botp

From: Frisco Del Rosario [mailto:[email protected]]=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
 
T

tragomaskhalos

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.
 
R

Robert Klemme

From: Frisco Del Rosario [mailto:[email protected]]
# "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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,206
Messages
2,571,070
Members
47,676
Latest member
scazeho

Latest Threads

Top