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!

···

--
Posted via http://www.ruby-forum.com/.

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 Biedenharn http://agileconsultingllc.com
Rob@AgileConsultingLLC.com

···

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

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"

···

--
Posted via http://www.ruby-forum.com/.

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]

···

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

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

--
Luc Heinrich - luc@honk-honk.com

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]

···

--
Posted via http://www.ruby-forum.com/.

David Springer 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...

···

--
Posted via http://www.ruby-forum.com/\.

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

David Springer wrote:

···

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

--
Posted via http://www.ruby-forum.com/\.

Same thing only different :slight_smile:

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

Harry

···

On Fri, Feb 26, 2010 at 7:13 AM, David Springer <dnspringer@gmail.com> 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...

Ruby simplifies thinking.

···

--
Posted via http://www.ruby-forum.com/\.

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

···

2010/2/26 Giampiero Zanchi <cidza@tin.it>:

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

David Springer wrote:

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

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

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

···

--
Posted via http://www.ruby-forum.com/.

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:

···

On Fri, Feb 26, 2010 at 10:35 AM, Marc Heiler <shevegen@linuxmail.org>wrote:

> Second day with Ruby, huh...

Ruby simplifies thinking.
--
Posted via http://www.ruby-forum.com/\.