2013-07-27 1 views
-4

У меня есть код, похожий наИтерация для выбора и изменения в рубин

@a.each{ |n| 
    if n == i then 
     @b.push n 
     n = 2*n 
    end 
} 

Я хочу, чтобы перебрать массив @a, и если какое-то условие n == i верно, то использовать текущий элемент n сделать @b.push n, и затем обновите его до n = 2*n на месте. Как я могу выполнять итерацию для выбора и изменения?

+0

Вы можете уточнить "обновить его ... на месте"? Вы хотите, чтобы значение 'n' в' @ a' было заменено на '2 * n', так что' @ a' теперь содержит '2 * n' вместо' n'? – lurker

+0

почему вместо этого вместо нового массива? является массив ввода массивным? – tokland

+0

Изменение значения 'n', похоже, превзошло цель итерации' n' over '@ a'. Ваше намерение не ясно. – sawa

ответ

3
@a.each.with_index do |n, j| 
    next unless n == i 
    @b.push(i) 
    @a[j] = 2 * i 
end 
0
@a.each_with_index do |n, x| 
    if n == i 
    @b.push n 
    @a[x] = 2*n 
    end 
end 
1

использованием each_with_index решена проблема

@a.each_with_index{ |n,q| 
    if n == i then 
     @b.push n 
     @a[q] = 2*n 
    end 
} 
1

NArray может сделать это очень быстро, если массив велик:

require 'narray' 

# Some sample data: 
a = NArray.int(100000).random(10) 

i = 8 
# b is a "boolean" array that can be used to select or modify 
# only certain elements in a 
b = a.eq i 

a[b] *= 2 

Если ваш первоначальный массив @a велик, и вы беспокоятся о производительности, возможно, вы захотите попробовать.

0

Надежда ниже будет работать:

@a.map!{|n| n == i ? (@b.push n; 2*n) : n } 
Смежные вопросы