Как узнать, является ли один массив подмножеством другого массива в Ruby? - PullRequest
0 голосов
/ 28 апреля 2018

желательно в рубине

Мне нужен способ определить, является ли один массив «подрешеткой» другого массива, когда порядок имеет значение

Например,

a = ["1", "4", "5", "7", "10"]
b = ["1", "4", "5"]
c = ["1", "5", "4"]
d = ["1", "5", "10"]

a includes b = true
a includes c = false
a include d = false

Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 28 апреля 2018

Вы можете join элементы с произвольным символом, затем сравнить строки:

a.join(' ').match?(array.join(' '))

Это работает для предоставленных вами тестов:

a.join(' ').match?(b.join(' '))                                                                                                                     
 #=> true
a.join(' ').match?(c.join(' '))                                                                                                                     
 #=> false
a.join(' ').match?(d.join(' '))                                                                                                                   
 #=> false

Но это не общее решение, и оно будет работать с различными типами массивов (см. Комментарии для дальнейшего обсуждения).

0 голосов
/ 28 апреля 2018
a = ["1", "4", "5", "7", "10"]
b = ["1", "4", "5"]
c = ["1", "5", "4"]
d = ["1", "5", "10"]


def sub_set?(arr_a, arr_b)
  arr_a.select.with_index do |a, index|
    arr_b[index] == a
  end == arr_b
end

puts "testing sub_set #{a.inspect} and #{c.inspect}"
puts sub_set?(a,c).inspect
0 голосов
/ 28 апреля 2018
class Array
  def includes(array)
    return false if array.size > self.size
    indexes = []
    self.each_with_index {|e, i| indexes << i if e == array[0]}
    p indexes
    indexes.each do |i|
      return true if self[i..i+array.size-1] == array
    end
    return false
  end
end

p a.includes b
p a.includes c
p a.includes d

Или меньше phpish:)

class Array
  def includes(array)
    return false if array.size > self.size
    indexes = each.with_index.select { |e, i| e == array[0] }.map(&:last)
    indexes.each {|i| self[i..i+array.size-1] == array ? (return true) : (return false)}
  end
end

p a.includes b
p a.includes c
p a.includes d
0 голосов
/ 28 апреля 2018
[b, c, d].map do |arr|
  a.each_cons(arr.length).any?(&arr.method(:==))
end
#⇒ [true, false, false]

Это определенно не самое эффективное решение, но для небольших массивов это работает и, что важно, доступно для чтения.

Enumerable#each_cons.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...