Сделать это за один проход? - PullRequest
0 голосов
/ 04 декабря 2010
while(i < bArray.length)
  if(aArray.include?(bArray[i]) == false) then
    return false
  end
  i+=1
end

Я написал выше, но нахожу это уродливым и раздутым. Должен быть четкий способ сделать это в одном утверждении ... но как?

Ответы [ 3 ]

6 голосов
/ 04 декабря 2010

Это должно быть эквивалентно:

while i < bArray.length
  return false unless aArray.include?(bArray[i])

  i += 1
end

Вот одна строка, которая, я думаю, должна быть эквивалентной:

bArray.all? { |item| aArray.include?(item) }
5 голосов
/ 04 декабря 2010

Похоже, вы пытаетесь выяснить, содержит ли aArray все элементы bArray.

aArray = %w[a b c d]
bArray = %w[a b c z]

(bArray - aArray).empty? # => false

Я посмотрел на оригинальный код поближе, и у него тикает логическая бомба:

def cmp_array(aArray, bArray)
  i = 0
  while (i < bArray.length)
    if (aArray.include?(bArray[i]) == false) then
      return false
    end
    i += 1
  end
end

def cmp_array2(a, b)
  (b - a).empty?
end

cmp_array( %w[ a b c ], %w[ a b c   ]) # => nil
cmp_array( %w[ a b c ], %w[ c b a   ]) # => nil
cmp_array( %w[ a b c ], %w[ a b     ]) # => nil
cmp_array( %w[ a b c ], %w[ a b c d ]) # => false
cmp_array( %w[ a b   ], %w[ a b c   ]) # => false

cmp_array2( %w[ a b c ], %w[ a b c   ]) # => true
cmp_array2( %w[ a b c ], %w[ c b a   ]) # => true
cmp_array2( %w[ a b c ], %w[ a b     ]) # => true
cmp_array2( %w[ a b c ], %w[ a b c d ]) # => false
cmp_array2( %w[ a b   ], %w[ a b c   ]) # => false

Мне пришлось добавить инициализатор i = 0, иначе Руби пожаловался на неинициализированную переменную.

Обратите внимание, что cmp_array возвращает либо ноль, либо false, что заставляет дополнительный тест для nil? или false? сделать что-то полезное.

if (cmp_array( %w[ a b c ], %w[ a b c   ]).nil?) ...

или

if (cmp_array( %w[ a b c ], %w[ a b c d ]).false?) ...

по сравнению с:

if (cmp_array2( %w[ a b c ], %w[ a b c   ])) ...

, который последовательно возвращает истину / ложь.

4 голосов
/ 04 декабря 2010
bArray.all?(&aArray.method(:include?))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...