Array problem

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

John Zoldiark wrote:

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

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.

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

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

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

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

Joshua B. wrote:

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.

Arg… regex…I am new to them. :wink: You are right, of course.
Thanks (for the correction and the !~)

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…

This works fine:

array.select { |item| item =~ /.bmp/ }

– Josh
http://iammrjoshua.com

Pierre P. wrote:

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…

array.grep /bmp$/
=> [“moreCoco.bmp”, “theFormat.bmp”]

John Zoldiark wrote:

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

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs