Array index question

J

John Smith

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!
 
R

Rob Biedenharn

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 ;-)
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
(e-mail address removed)
 
D

David Springer

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 << "\""
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"
 
L

Luc Heinrich

textlist =3D ["Apple", "Orange", "Lemon", "Grape", "Orange",=20
"Melon","Orange", "Banana"]
=20
i =3D textlist.index("Orange")
=20
if !i.nil?
puts "textlist[" << i.to_s << "] is \"" << textlist << "\""
j =3D 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 =3D Array.new
self.each_with_index {|s,i| indexes << i if s =3D=3D=3D obj }
return indexes
end
end

textlist =3D ["Apple", "Orange", "Lemon", "Grape", "Orange", =
"Melon","Orange", "Banana"]
p textlist.indexes_of("Orange")

#=3D> [1,4,6]

--=20
Luc Heinrich - (e-mail address removed)
 
D

David Springer

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 == "Orange"}[1]
 
P

Paul Harrington

David said:
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 == "Orange"}[1]


Second day with Ruby, huh...
 
S

Sven Schott

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

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. :)
 
G

Giampiero Zanchi

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

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

Robert Klemme

2010/2/26 Giampiero Zanchi said:
in order to simplify ...
(0...textlist.length).select {|i| textlist == "Orange"}[1]

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


Interesting approach. That could also be done with

irb(main):005:0> textlist.size.times.select {|i| textlist == "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
 
H

Harry Kakueki

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 == "Orange"}[1]


Same thing only different :)

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


Harry
 
A

Alex Baranosky

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
 

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

Forum statistics

Threads
473,764
Messages
2,569,567
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top