Array index question

Question about an array. Say I have the following array…

textlist = [“Apple”, “Orange”, “Lemon”, “Grape”, “Orange”, “Melon”,
“Orange”, “Banana”]

if I did textlist.index(“Orage”), I would get “1” returned.

Can anyone tell me how I could retrieve the index number of the 2nd
instance of “Orange”?

Thanks in advance!

On Feb 25, 2010, at 11:12 AM, John S. wrote:

Question about an array. Say I have the following array…

textlist = [“Apple”, “Orange”, “Lemon”, “Grape”, “Orange”, “Melon”,
“Orange”, “Banana”]

if I did textlist.index(“Orage”), I would get “1” returned.
“Orage” #=> nil
“Orange” #=> 1 :wink:

Can anyone tell me how I could retrieve the index number of the 2nd
instance of “Orange”?

Thanks in advance!

Well, I thought this was a simple answer, but I was remembering
String#index(string, offset)

something like this:

def textlist.where_is(target)
locations = []
each_with_index {|e,i| locations << i if target === e }
return nil if locations.empty?
locations
end

textlist.where_is(“Orange”) #=> [1,4,6]
textlist.where_is(“Cherry”) #=> nil
textlist.where_is(“Grape”) #=> [3]

Define it on Array if you want or in a module to extend any object you
want.

-Rob

Rob B. http://agileconsultingllc.com
[email protected]

Please excuse my newbieness, second day with Ruby.

textlist = [“Apple”, “Orange”, “Lemon”, “Grape”, “Orange”,
“Melon”,“Orange”, “Banana”]

i = textlist.index(“Orange”)

if !i.nil?
puts “textlist[” << i.to_s << “] is “” << textlist[i] << “””
j = textlist[i+1,textlist.length-i-1].index(“Orange”)+i+1
if !j.nil?
puts “textlist[” << j.to_s << “] is “” << textlist[j] << “””
end
end

outputs:

textlist[1] is “Orange”
textlist[4] is “Orange”

On 25 févr. 2010, at 19:20, David S. wrote:

   end

end

class Array
def indexes_of(obj)
indexes = Array.new
self.each_with_index {|s,i| indexes << i if s === obj }
return indexes
end
end

textlist = [“Apple”, “Orange”, “Lemon”, “Grape”, “Orange”,
“Melon”,“Orange”, “Banana”]
p textlist.indexes_of(“Orange”)

#=> [1,4,6]

David S. wrote:

after some inspiration from Luc I was able to come up with this:

textlist = [“Apple”, “Orange”, “Lemon”, “Grape”, “Orange”,

(0…textlist.length-1).select {|i| textlist[i] == “Orange”}[1]

Second day with Ruby, huh…

Second day with Ruby, huh…

Ruby simplifies thinking.

after some inspiration from Luc I was able to come up with this:

textlist = [“Apple”, “Orange”, “Lemon”, “Grape”, “Orange”,

(0…textlist.length-1).select {|i| textlist[i] == “Orange”}[1]

in order to simplify …
(0…textlist.length).select {|i| textlist[i] == “Orange”}[1]

David S. wrote:

(0…textlist.length-1).select {|i| textlist[i] == “Orange”}[1]

I like Luc’s but ever since I got hit with inject:

class Array
def indices_of(obj)
self.inject([]) { |arr, element| arr << element if element == obj;
arr
}
end
end

And I like indices not because I’m language nazi but because of personal
preference. :slight_smile:

2010/2/26 Giampiero Z. [email protected]:

in order to simplify …
(0…textlist.length).select {|i| textlist[i] == “Orange”}[1]

David S. wrote:

(0…textlist.length-1).select {|i| textlist[i] == “Orange”}[1]

Interesting approach. That could also be done with

irb(main):005:0> textlist.size.times.select {|i| textlist[i] ==
“Orange”}
=> [1, 4, 6]

I have

irb(main):001:0> textlist = [“Apple”, “Orange”, “Lemon”, “Grape”,
“Orange”, “Melon”,
irb(main):002:1* “Orange”, “Banana”]
=> [“Apple”, “Orange”, “Lemon”, “Grape”, “Orange”, “Melon”, “Orange”,
“Banana”]
irb(main):003:0> textlist.each_with_index.partition {|a,i| a ==
“Orange”}.first.map {|a,i| i}
=> [1, 4, 6]

or, even better

irb(main):006:0> textlist.each_with_index.select {|a,i| a ==
“Orange”}.map {|a,i| i}
=> [1, 4, 6]

Hmmm, we could also do

irb(main):007:0> textlist.each_with_index.select {|a,i| a ==
“Orange”}.map(&:last)
=> [1, 4, 6]

This is all very 1.9ish though. :wink:

Kind regards

robert

On Fri, Feb 26, 2010 at 7:13 AM, David S. [email protected]
wrote:

after some inspiration from Luc I was able to come up with this:

textlist = [“Apple”, “Orange”, “Lemon”, “Grape”, “Orange”,

(0…textlist.length-1).select {|i| textlist[i] == “Orange”}[1]

Same thing only different :slight_smile:

p textlist.fill{|x| x if textlist[x] == “Orange”}.compact[1]

Harry

Here’s my solution in 1.9:

class Array
def indices_of(value)
indices = self.each_with_index.select { |v, i| v == value
}.collect{|v, i| i }
indices.empty? ? nil : indices
end
end