2015-03-10 2 views
0

У меня есть проблема, которая кажется простой, но я, похоже, не могу решить эту проблему.Проверьте, что элементы в массиве одинаковы в Ruby.

У меня есть массив, который выглядит так: ["foobar", "foo", "bar", "foobar"] Я хочу написать метод, который проверяет элементы массива и соединяет два разных. Таким образом, результирующий массив будет ["foobar", "foobar", "foobar"]

У меня устало следующее, но я получаю массив чисел, а не строк.

`` `

array = %w(foobar foo bar foobar) 
@i = 0 
array.map do |item| 
    if item != array[i+1] 
    item + array[@i+1] 
    else 
    item 
    end 
    i += 1 
end 

` ``

+0

Если у вас есть '[ "Foobar", "Foo", "бар", "Баз", "Foobar"]' то ?? –

ответ

1

Причины вы получаете номер в вашем массиве i+=1 возвращается число, так это то, что в конечном итоге в вашем результирующем массиве. То, что вы хотите сделать, это создать итератор, который содержит индекс, а затем карту на что:

array.each_with_index.map do |item, i| 
    if item != array[i + 1] 
    item + array[i + 1] 
    else 
    item 
    end 
end 

Это не будет на самом деле даст вам результат вы хотите, хотя, так как для примера массива вы получите ['foobar', 'foobar', 'barfoobar', 'foobar'] ,

Лучший подход будет зависеть от фактического ожидаемого содержимого массивов. Для вашего массива образца, я бы:

array.each_with_index.map do |item, i| 
    if item != array[i + 1] && array[i + 1] != array.max 
    item + array[i + 1] 
    elsif item != array[i + 1] 
    nil 
    else 
    item 
    end 
end.compact 
+0

Ах, конечно. Я забыл, что Ruby возвращает последнюю строку. Когда я запускаю это, я получаю 'TypeError: нет неявного преобразования nil в String'. Это потому, что 'item' равен нулю при первой итерации? – cassidycodes

+0

Я предполагаю, что это связано с тем, что 'array [i + 1]', когда 'array [i]' является последним элементом. Тебе тоже придется это объяснять. – ptd

Смежные вопросы