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/.
>
> 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
R...@AgileConsultingLLC.com
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"
> 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
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]
--
Luc Heinrich - l...@honk-honk.com
textlist = ["Apple", "Orange", "Lemon", "Grape", "Orange",
(0..textlist.length-1).select {|i| textlist[i] == "Orange"}[1]
Second day with Ruby, huh...
Ruby simplifies thinking.
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. :)
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. ;-)
Kind regards
robert
--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/
Same thing only different :)
p textlist.fill{|x| x if textlist[x] == "Orange"}.compact[1]
Harry
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