Определение, содержит ли один массив содержание другого массива в рубине

В рубине, как я тестирую тот один массив не только, имеет элементы другого массива, но и содержите их в том особом порядке?

correct_combination = [1, 2, 3, 4, 5]
[1, 5, 8, 2, 3, 4, 5].function_name(correct_combination) # => false
[8, 10, 1, 2, 3, 4, 5, 9].function_name(correct_combination) # => true

Я пытался использовать include, но это используется, чтобы протестировать ли [1,2,3].include?(2) верно или нет.

8
задан Andrew Grimm 18 May 2010 в 07:17
поделиться

6 ответов

Вы можете использовать метод each_cons:

arr = [1, 2, 3, 4, 5]
[1, 5, 8, 2, 3, 4, 5].each_cons(arr.size).include? arr

В этом случае он будет работать для любых элементов.

14
ответ дан 5 December 2019 в 07:57
поделиться

Возможно, <=> - это то, что вы ищете.

Comparison-Returns an integer (-1, 0, or +1) if this array is less than, equal to, or greater than other_array

a = [1, 2, 3, 4, 5]
b = [1, 5, 8, 2, 3, 4, 5]
c = [8, 10, 1, 2, 3, 4, 5, 9]

puts a <=> b # => -1
puts a <=> c # => -1
puts a <=> a # => 0

Update: неважно, просто отметил, что ему не важна позиция.

puts a <=> a.reverse # => -1
-2
ответ дан 5 December 2019 в 07:57
поделиться

Вы можете просто сравнить массивы как строки:

correct_combination = [1, 2, 3, 4, 5]
yep = [8, 10, 1, 2, 3, 4, 5, 9]
nope = [1, 5, 8, 2, 3, 4, 5]
if yep.to_s.include?(correct_combination.to_s)
  puts "yep"
end
if nope.to_s.include?(correct_combination.to_s)
  puts "nope"
end
-3
ответ дан 5 December 2019 в 07:57
поделиться

Это лучшее, что я мог придумать. Все вызовы return немного уродливы, но это должно быть быстрее, чем сравнение строк, если это большие массивы.

class Array
  def same?(o)
    if self.size == o.size
      (0..self.size).each {|i| return false if self[i] != o[i] }
    else
      return false
    end

    return true
  end
end

a = [1,2,3,4,5]
b = [1, 5, 8, 2, 3, 4, 5]
c = [1, 2, 6, 4, 5]

puts a.same?(a.reverse) # => false
puts a.same?(a) # => true
puts a.same?(b) # => false
puts a.same?(c) # => false
-2
ответ дан 5 December 2019 в 07:57
поделиться

Не совсем лучшее возможное решение, но, по крайней мере, оно краткое

(',' + [1, 5, 8, 2, 3, 4, 5].join(',') + ',').include?(',' + correct_combination.join(',') + ',')

Лучшим возможным решением было бы использовать один из алгоритмов поиска строк в массиве, но вам придется кодировать его самостоятельно, я не понимаю не думаю, что есть стандартное решение.

3
ответ дан 5 December 2019 в 07:57
поделиться

Если вы хотите игнорировать порядок (как я сделал, когда наткнулся на этот пост), вы можете использовать Array.sort и <=> http://ruby-doc.org/core-1.8.7/classes/Array.html#M000316

a = [1, 2, 3, 4, 5]
b = [2, 1, 5, 4, 3]
a.sort <=> b.sort

Затем вам нужно проверить, что выходное значение равно 0.

4
ответ дан 5 December 2019 в 07:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: