2017-01-27 2 views
1

Я использую Ruby 2.4. У меня есть массив, который я хочу разделить на две части, в которых первый массив будет либо буква «а» или «б», а второй массив будет все остальное, так что у меня есть этаКак разбить массив на два, если один из элементов - это нуль?

arr1, arr2 = data_col.map { |x| a, b, c = x.partition(/^[ab][[:space:]]+/i); [b.strip, a + c] }.transpose 

Однако , это не удается, если один из элементов в массиве равен нулю. Как мне объяснить это и заставить два элемента nil быть в результирующих массивах? То есть, если исходный массив

["A bcd", nil, "B 123"] 

результирующих массивов будет

["A", nil, "B"], ["bcd", nil, "123"] 

?

ответ

0

Явного проверить это

arr1, arr2 = data_col.map do |x| 
    if x 
    a, b, c = x.partition(/^[ab][[:space:]]+/i) 
    [b.strip, a + c] 
    else 
    [nil, nil] 
    end 
end.transpose 

Существует нет умного способа сделать здесь nil распространения.


И если ты крут с "" в результате чего элементы, попробуйте это

arr1, arr2 = data_col.map { |x| a, b, c = (x || "").partition(/^[ab][[:space:]]+/i); [b.strip, a + c] }.transpose 
0

Предполагая, не нулевые элементы всегда должны быть разделена на месте, вы можете избавиться от разделов и регулярных выражений тестирования и просто сделать это:

>> a = ["A bcd", nil, "B 123"] 
>> a.map { |e| e ? [e.split.first, e.split.last] : [nil, nil] }.transpose 
=> [["A", nil, "B"], ["bcd", nil, "123"]] 
+0

Это не работает. Если входной сигнал «[» C abc », nil,« B abc »] ', то с помощью вашей функции над результатом будут два массива, один с« [«C», nil, «B»] ». Я не хочу разбить leter «C» на свой собственный массив, только буквы «a» или «b». –

+0

Это была бы полезная информация. Я работал исходя из предположения, как я сказал выше. Возможно, вы могли бы предоставить образцы данных, которые бы включили встречный пример. Рад, что у вас есть ответ, который работает. – moveson

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