Array problem

J

John Zoldiark

I have an array like this:
array = [ "manyThings.mp3", "myLike.gif", "moreCoco.bmp",
"theFormat.bmp"]

and I want to make some comparison to eliminate all the words in the
array that are NOT of the bmp format. So at the end the array will look
like this:

array = ["moreCoco.bmp", "theFormat.bmp"]

is there a way to do this???

Many thanks for the help
 
S

Sebastian W.

John said:
I have an array like this:
array = [ "manyThings.mp3", "myLike.gif", "moreCoco.bmp",
"theFormat.bmp"]

and I want to make some comparison to eliminate all the words in the
array that are NOT of the bmp format. So at the end the array will look
like this:

array = ["moreCoco.bmp", "theFormat.bmp"]

is there a way to do this???

Many thanks for the help

Hi John,
Yep, try this:

array.reject! {|elem| elem.split(".").last != "bmp"}

Cheers,
Sebastian
 
J

Joshua Ball

[Note: parts of this message were removed to make it a legal post.]

I think this should do it:

array.delete_if { |elem| not elem =~ /.bmp/i }
It worked for the following test:
array = [ "manyThings.mp3", "myLike.gif", "moreCoco.BmP", "theFormat.bmp"]
array.delete_if { |elem| not elem =~ /.bmp/i }
array.each do |elem|
puts elem
end
 
S

Sebastian W.

And just another note: generally, for transforming and/or iterating over
arrays, finding/removing elements, extracting values, and so on, you'll
want to take a look at Ruby's "Enumerable" module. It's available on all
the main collections in Ruby and is extremely handy.

Particularly, the "each", "select", "map", "partition" and "reject"
methods are very handy. I use "map" and "select" all the time.
 
S

Scott Lillibridge

[Note: parts of this message were removed to make it a legal post.]

See Array#select
irb(main):007:0> array.select{|x| x.match(/.*\.bmp/)}
=> ["moreCoco.bmp", "theFormat.bmp"]
 
J

Joshua Ball

[Note: parts of this message were removed to make it a legal post.]

Actually, the regex should have the end of string anchor:
array.delete_if { |elem| not elem =~ /.bmp$/i }

I think this should do it:

array.delete_if { |elem| not elem =~ /.bmp/i }
It worked for the following test:
array = [ "manyThings.mp3", "myLike.gif", "moreCoco.BmP", "theFormat.bmp"]
array.delete_if { |elem| not elem =~ /.bmp/i }
array.each do |elem|
puts elem
end


I have an array like this:
array = [ "manyThings.mp3", "myLike.gif", "moreCoco.bmp",
"theFormat.bmp"]

and I want to make some comparison to eliminate all the words in the
array that are NOT of the bmp format. So at the end the array will look
like this:

array = ["moreCoco.bmp", "theFormat.bmp"]

is there a way to do this???

Many thanks for the help
 
C

Christophe Mckeon

you might also want to anchor your regex
(the $ at the end) so that it won't work on
file names like 'foo.bmp.gz'. and be sure
to escape your . in front of bmp with \.

array.delete_if { |elem| elem !~ /\.bmp$/i }

also note the regex not match operator !~

cheers,
_c
 
T

Tim Greer

Joshua said:
Actually,  the regex should have the end of string anchor:
array.delete_if { |elem| not elem =~ /.bmp$/i }

Also, remember that . is any character, whereas \. is just . for the
sake of getting exactly what you want. !~ looks cleaner to me, but
that's just personal preference in most cases.
 
J

Joshua Ball

[Note: parts of this message were removed to make it a legal post.]

Arg... regex...I am new to them. ;-) You are right, of course.
Thanks (for the correction and the !~)
 
P

Pierre Pat

if you are like me an ignorant of regex, you could try this

array.delete_if { |elem| elem.index_of(".bmp") + 4 = elem.size}
though I don't have an interpreter at the moment, so it hasn't been
tested...
 
S

Sebastian Hungerecker

John said:
I have an array like this:
array = [ "manyThings.mp3", "myLike.gif", "moreCoco.bmp",
"theFormat.bmp"]

and I want to make some comparison to eliminate all the words in the
array that are NOT of the bmp format. So at the end the array will look
like this:

array = ["moreCoco.bmp", "theFormat.bmp"]

Instead of a reject/select you can also use grep when working with regexen:
array.grep(/\.bmp$/)
Instead of using a regex you could also use File.extname here:
array.select {|x| File.extname(x)==".bmp"}
Of course all these only tell you that the filenames end with .bmp, not in
which format the files actually are.

HTH,
Sebastian
 

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

No members online now.

Forum statistics

Threads
474,181
Messages
2,570,970
Members
47,537
Latest member
BellCorone

Latest Threads

Top