Array element access


#1

Hi,

I’ve got an array a= [1,2,3,4,5,6] and want to access each second
element:
b=[2,4,6]. How is this done in ruby?

I know, that I can use a for-loob and modulo operator, but I think there
is a “ruby way” of doing this.

Thanks.
tomas


#2

On Mar 12, 2006, at 9:34 PM, Tomas F. wrote:

Thanks.
tomas


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

require ‘enumerator’
a = (1…10).to_a
p a.enum_for(:each_slice, 2).collect { |m| m[1] } # -> [2, 4, 6, 8, 10]

– Daniel


#3

I’ve got an array a= [1,2,3,4,5,6] and want to access each second
element:
b=[2,4,6]. How is this done in ruby?

This is ugly, but it works:

a = [1,2,3,4,5,6]
(1…a.length).step(2) { |i| puts a[i] }

-Harold


#4

Daniel H. wrote:

is a “ruby way” of doing this.
p a.enum_for(:each_slice, 2).collect { |m| m[1] } # -> [2, 4, 6, 8, 10]

– Daniel

enumerator is handy but it seems a bit like overkill for a task that can
be done with the builtin classes:

irb(main):009:0> ary = [1,2,3,4,5,6]
=> [1, 2, 3, 4, 5, 6]
irb(main):010:0> ary2 = []
=> []
irb(main):011:0> ary.each_with_index { |a, i| ary2 << a if i % 2 == 1 }
=> [1, 2, 3, 4, 5, 6]
irb(main):012:0> ary2
=> [2, 4, 6]


#5

array.inject(false) do |alternate,element|
if alternate
# Your processing
end
!alternate
end


#6

Daniel H. wrote:

is a “ruby way” of doing this.
p a.enum_for(:each_slice, 2).collect { |m| m[1] } # -> [2, 4, 6, 8, 10]

– Daniel

f=1
[1,2,3,4,5,6].select{f=!f}.each{|x|p x}


#7

Daniel H. wrote:

is a “ruby way” of doing this.

– Daniel

I might do it this way:

map , = (1…10).partition{|i| i%2==0}
map.each {|i| puts a[i]}

or this way

a.each_with_index {|a,i| if i%2 == 0; … ; end}

Depending on my needs and mood


#8

On 12 mars 06, at 21:34, Tomas F. wrote:

I’ve got an array a= [1,2,3,4,5,6] and want to access each second
element:
b=[2,4,6]. How is this done in ruby?

irb(main):001:0> a = [1,2,3,4,5,6]
=> [1, 2, 3, 4, 5, 6]
irb(main):002:0> a.select {|e| a.index(e) % 2 == 1 }
=> [2, 4, 6]


#9

On 3/12/06, Luc H. removed_email_address@domain.invalid wrote:

That’s a problem if there are duplicates in the array:

irb(main):012:0> a=[1,1,2,2,3,3,4,5]
=> [1, 1, 2, 2, 3, 3, 4, 5]
irb(main):013:0> a.select{|e| a.index(e) %2 == 1}
=> [5]
irb(main):014:0> s=true
=> true
irb(main):015:0> a.select{s=!s}
=> [1, 2, 3, 5]
irb(main):016:0>

-Adam


#10

On Mon, 13 Mar 2006, Tomas F. wrote:

tomas
Fixnum#step is one of the easiest ways to do this:

harp:~ > cat a.rb
a = [1, 2, 3, 4, 5, 6]
1.step(a.size, 2){|i| p a[i]}

harp:~ > ruby a.rb
2
4
6

regards.

-a


#11

On 13 mars 06, at 01:00, Adam S. wrote:

That’s a problem if there are duplicates in the array:

Yep, good catch.


#12

Tomas F. wrote:

tomas
I’ve always been intrigued by creating a generalized enumeration system.
Have
you guys seen this: http://www.rubyweeklynews.org/20050710 : accessing
index
inside map. For example:

(1…10).collect.with_index { |v, i| v * i }

I think that is sweet! I wonder if it can be generalized enough to do
this:

file.collect.each_byte.with_index { |b, i| b + 1 }

Mike


#13

removed_email_address@domain.invalid wrote:

returned (array vs. enumerator). It’s almost as if the call to
collect wasn’t a “real” call to collect, but rather a kind of
place-holder for a collect operation. I’m not sure.

Ok, what if you rearrange the order of the calls:

file.each_byte.with_index.collect { |b, i| b + 1 }

That’s more left-to-right object-oriented sounding. Come to think of it
I like
this better because now collect is at the end, and that is the the final
intent
(with the block being next to it).

Mike


#14

Hi –

On Tue, 14 Mar 2006, Mike A. wrote:

tomas

I’ve always been intrigued by creating a generalized enumeration system.
Have you guys seen this: http://www.rubyweeklynews.org/20050710 : accessing
index inside map. For example:

(1…10).collect.with_index { |v, i| v * i }

I think that is sweet! I wonder if it can be generalized enough to do this:

file.collect.each_byte.with_index { |b, i| b + 1 }

I’m not sure why, but to my eye this has always looked somewhat
obscure. I guess it’s something about having to read to the right,
even to the extent of not seeing a block, before I know what’s being
returned (array vs. enumerator). It’s almost as if the call to
collect wasn’t a “real” call to collect, but rather a kind of
place-holder for a collect operation. I’m not sure.

David


David A. Black (removed_email_address@domain.invalid)
Ruby Power and Light, LLC (http://www.rubypowerandlight.com)

“Ruby for Rails” chapters now available
from Manning Early Access Program! http://www.manning.com/books/black


#15

Hi –

On Tue, 14 Mar 2006, Mike A. wrote:

b=[2,4,6]. How is this done in ruby?

returned (array vs. enumerator). It’s almost as if the call to
collect wasn’t a “real” call to collect, but rather a kind of
place-holder for a collect operation. I’m not sure.

Ok, what if you rearrange the order of the calls:

file.each_byte.with_index.collect { |b, i| b + 1 }

That’s more left-to-right object-oriented sounding. Come to think of it I
like this better because now collect is at the end, and that is the the final
intent (with the block being next to it).

There’s still something I don’t like about using method-chaining
syntax for this. It may just be a failure of imagination on my part.

David


David A. Black (removed_email_address@domain.invalid)
Ruby Power and Light, LLC (http://www.rubypowerandlight.com)

“Ruby for Rails” chapters now available
from Manning Early Access Program! http://www.manning.com/books/black