Dado:
a1 = [5, 1, 6, 14, 2, 8]
Gostaria de determinar se ele contém todos os elementos de:
a2 = [2, 6, 15]
Nesse caso, o resultado é false
.
Existe algum método Ruby / Rails interno para identificar essa inclusão de matriz?
Uma maneira de implementar isso é:
a2.index{ |x| !a1.include?(x) }.nil?
Existe uma maneira melhor e mais legível?
ruby-on-rails
arrays
ruby
Misha Moroshko
fonte
fonte
Respostas:
fonte
(a2-a1).empty?
(a2.uniq - a1.uniq).empty?
Talvez seja mais fácil ler isso:
Você também pode usar a interseção da matriz:
Observe que
size
é usado aqui apenas para velocidade, você também pode fazer (mais devagar):Mas acho que o primeiro é mais legível. Estes 3 são simples rubi (não trilhos).
fonte
Isso pode ser alcançado fazendo
Isso cria a interseção de ambas as matrizes, retornando todos os elementos dos
a2
quais também estãoa1
. Se o resultado for o mesmoa2
, você pode ter certeza de que todos os elementos estão incluídosa1
.Essa abordagem só funciona se todos os elementos em
a2
forem diferentes um do outro em primeiro lugar. Se houver duplas, essa abordagem falhará. O de Tempos ainda funciona, então eu recomendo sinceramente sua abordagem (também é provavelmente mais rápida).fonte
length
método terá um desempenho muito melhorSe não houver elementos duplicados ou você não se importar com eles, poderá usar a classe Set :
Nos bastidores isso usa
fonte
Você pode aplicar um patch de macaco à classe Array:
teste
Obviamente, o método pode ser escrito como um método padrão sozinho, por exemplo
e você pode invocá-lo como
De fato, após a criação de perfil, a versão a seguir é muito mais rápida e o código é mais curto.
fonte
Dependendo do tamanho de suas matrizes, você pode considerar um algoritmo eficiente O (n log n)
A classificação dos custos O (n log n) e a verificação de cada par custa O (n), portanto, esse algoritmo é O (n log n). Os outros algoritmos não podem ser mais rápidos (assintoticamente) usando matrizes não classificadas.
fonte
A maioria das respostas com base em (a1 - a2) ou (a1 e a2) não funcionaria se houver elementos duplicados em qualquer matriz. Cheguei aqui procurando uma maneira de ver se todas as letras de uma palavra (divididas em uma matriz) faziam parte de um conjunto de letras (por exemplo, scrabble). Nenhuma dessas respostas funcionou, mas esta funciona:
fonte