Dany:
a1 = [5, 1, 6, 14, 2, 8]
Chciałbym ustalić, czy zawiera wszystkie elementy:
a2 = [2, 6, 15]
W tym przypadku wynikiem jest false
.
Czy są jakieś wbudowane metody Ruby / Rails do identyfikacji takiego włączenia tablicy?
Jednym ze sposobów realizacji tego jest:
a2.index{ |x| !a1.include?(x) }.nil?
Czy istnieje lepszy, bardziej czytelny sposób?
ruby-on-rails
arrays
ruby
Misha Moroshko
źródło
źródło
Odpowiedzi:
źródło
(a2-a1).empty?
(a2.uniq - a1.uniq).empty?
Być może łatwiej to przeczytać:
Możesz również użyć przecięcia tablicy:
Zauważ, że
size
jest tu używane tylko dla szybkości, możesz również zrobić (wolniej):Ale myślę, że pierwszy jest bardziej czytelny. Te 3 to zwykły rubin (bez szyn).
źródło
Można to osiągnąć poprzez działanie
Tworzy to przecięcie obu tablic, zwracając wszystkie elementy, z
a2
których również się znajdująa1
. Jeśli wynik jest taki sam jaka2
, możesz być pewien, że masz wszystkie elementy zawarte wa1
.To podejście działa tylko wtedy, gdy wszystkie elementy
a2
są różne od siebie w pierwszej kolejności. Jeśli są dublety, to podejście zawodzi. Ten z Tempos nadal wtedy działa, więc z całego serca polecam jego podejście (też chyba szybsze).źródło
length
metody będzie znacznie lepszeJeśli nie ma zduplikowanych elementów lub nie przejmujesz się nimi, możesz skorzystać z klasy Set :
Za kulisami to wykorzystuje
źródło
Możesz małpować klasę Array:
test
Oczywiście metodę można zapisać jako metodę samodzielną, np
i możesz to wywołać jak
Rzeczywiście, po profilowaniu poniższa wersja jest znacznie szybsza, a kod krótszy.
źródło
W zależności od tego, jak duże są twoje tablice, możesz rozważyć wydajny algorytm O (n log n)
Sortowanie kosztów O (n log n) i sprawdzanie każdej pary kosztuje O (n), więc algorytm ten wynosi O (n log n). Inne algorytmy nie mogą być szybsze (asymptotycznie) przy użyciu niesortowanych tablic.
źródło
Większość odpowiedzi opartych na (a1 - a2) lub (a1 i a2) nie zadziała, jeśli w którejś z tablic są zduplikowane elementy. Przyjechałem tutaj, szukając sposobu, aby sprawdzić, czy wszystkie litery słowa (podzielone na tablicę) są częścią zestawu liter (na przykład do scrabble). Żadna z tych odpowiedzi nie zadziałała, ale ta:
źródło