Рубиновый массив с дополнительным состоянием - PullRequest
1 голос
/ 06 октября 2011

Я пытаюсь пройти через массив и добавить второе измерение для значений true и false в ruby.

Например.Я буду выдвигать массивы в другой массив, где это будет:

a = [[1,2,3,4],[5]]

Я хотел бы пройти через каждый массив внутри "a" и иметь возможность пометить состояние true или false для каждого отдельногозначение.Похож на карту из Java.

Есть идеи?Спасибо.

Ответы [ 3 ]

2 голосов
/ 06 октября 2011

Вам лучше начать с этого:

a = [{ 1 => false, 2 => false, 3 => false, 4 => false }, { 5 => false }]

Тогда вы можете просто переворачивать логические значения по мере необходимости. В противном случае вам придется загрязнить ваш код кучей тестов, чтобы проверить, есть ли у вас Fixnum (1, 2, ...) или Hash ({1 => true}), прежде чем вы сможете проверить значение флага.

Хэши в Ruby 1.9 упорядочены, поэтому вы не потеряете их, переключившись на хэши.

Вы можете преобразовать свой массив в эту форму одним из следующих способов:

a = a.map { |x| Hash[x.zip([false] * x.length)] }
# or
a = a.map { |x| x.each_with_object({}) { |i,h| h[i] = false } }

И если использование nil в значении «не посещено» имеет больше смысла, чем начинать с false, тогда:

a = a.map { |x| Hash[x.zip([nil] * x.length)] }
# or
a = a.map { |x| x.each_with_object({}) { |i,h| h[i] = nil } }

Некоторые полезные ссылки:

1 голос
/ 06 октября 2011

Если то, что вы пытаетесь сделать, это просто пометить определенные элементы в массивах-членах логическими значениями, это просто сделать следующее:

current_value = a[i][j]
a[i][j] = [current_value, true_or_false]

Например, если у вас есть

a = [[1,2,3,4],[5]]

Тогда, если вы скажете

a[0][2] = [a[0,2],true]

тогда a становится

a = [[1,2,[3,true],4],[5]]

Вы можете свернуть это в метод

def tag_array_element(a, i, j, boolean_value)
    a[i][j] = [a[i][j], boolean_value]
end

Возможно, вы захотите немного улучшить это, чтобы не отмечать определенный элемент дважды. :) Для этого просто проверьте, является ли a[i][j] массивом.

0 голосов
/ 06 октября 2011

Изменить x % 2 == 0 для фактической операции, которую вы хотите для сопоставления:

>> xss = [[1,2,3,4],[5]]
>> xss.map { |xs| xs.map { |x| {x => x % 2} } } 
#=> [[{1=>false}, {2=>true}, {3=>false}, {4=>true}], [{5=>false}]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...