[RUBY-ON-RAILS] 하나 개의 배열이 다른 배열의 모든 요소가 포함되어 있는지 확인하는 방법
RUBY-ON-RAILS하나 개의 배열이 다른 배열의 모든 요소가 포함되어 있는지 확인하는 방법
주어진:
a1 = [5, 1, 6, 14, 2, 8]
나는 모든 요소가 포함되어 있는지 확인하고 싶습니다 :
a2 = [2, 6, 15]
이 경우에 그 결과는 거짓이다.
거기에있는 모든 내장 된 루비 / 같은 배열 포함을 식별하는 방법을 레일?
이를 구현하는 한 가지 방법은 다음과 같습니다
a2.index{ |x| !a1.include?(x) }.nil?
더 나은, 더 읽을 수있는 방법이 있나요?
해결법
-
==============================
1.
a = [5, 1, 6, 14, 2, 8] b = [2, 6, 15] a - b => [5, 1, 14, 8] b - a => [15] (b - a).empty? => false
-
==============================
2.아마도 이것은 쉽게 읽을 수 있습니다 :
아마도 이것은 쉽게 읽을 수 있습니다 :
a2.all? { |e| a1.include?(e) }
또한 배열 교차로를 사용할 수 있습니다 :
(a1 & a2).size == a1.size
참고 크기가 단지 속도를 여기에 사용되는, 당신은 또한 (느리게) 할 수 있습니다 :
(a1 & a2) == a1
하지만 가장 먼저 더 읽을 것 같아요. 이 3 일반 루비 (안 레일)입니다.
-
==============================
3.이것은 수행하여 달성 될 수있다
이것은 수행하여 달성 될 수있다
(a2 & a1) == a2
이는 A1 A2에도있는 모든 요소를 반환 두 배열의 교차점을 생성한다. 결과는 A2와 같은 경우, 당신은 A1에 포함 된 모든 요소를 확신 할 수 있습니다.
A2의 모든 요소가 첫 번째 장소에서 서로 다른 경우이 방법은에만 작동합니다. 복식이있는 경우,이 방법은 실패합니다. 나는 진심으로 자신의 접근 방식을 권장 있도록 템포에서 하나 여전히 다음 작동 (또한 아마 더 빠르다).
-
==============================
4.이 경우 중복 요소 없거나 그런 다음 설정 클래스를 사용할 수 있습니다, 그들에 대해 걱정하지 않는다 :
이 경우 중복 요소 없거나 그런 다음 설정 클래스를 사용할 수 있습니다, 그들에 대해 걱정하지 않는다 :
a1 = Set.new [5, 1, 6, 14, 2, 8] a2 = Set.new [2, 6, 15] a1.subset?(a2) => false
장면이 사용 뒤에
all? { |o| set.include?(o) }
-
==============================
5.당신은 Array 클래스를 원숭이 패치 할 수 있습니다 :
당신은 Array 클래스를 원숭이 패치 할 수 있습니다 :
class Array def contains_all?(ary) ary.uniq.all? { |x| count(x) >= ary.count(x) } end end
테스트
irb(main):131:0> %w[a b c c].contains_all? %w[a b c] => true irb(main):132:0> %w[a b c c].contains_all? %w[a b c c] => true irb(main):133:0> %w[a b c c].contains_all? %w[a b c c c] => false irb(main):134:0> %w[a b c c].contains_all? %w[a] => true irb(main):135:0> %w[a b c c].contains_all? %w[x] => false irb(main):136:0> %w[a b c c].contains_all? %w[] => true irb(main):137:0> %w[a b c d].contains_all? %w[d c h] => false irb(main):138:0> %w[a b c d].contains_all? %w[d b c] => true
물론 방법은 예를 들어, 표준 형 방법과 같이 쓸 수있다
def contains_all?(a,b) b.uniq.all? { |x| a.count(x) >= b.count(x) } end
그리고 당신처럼 호출 할 수 있습니다
contains_all?(%w[a b c c], %w[c c c])
실제로, 프로파일 링 한 후, 다음 버전은 훨씬 더 빨리, 그리고 코드가 짧습니다.
def contains_all?(a,b) b.all? { |x| a.count(x) >= b.count(x) } end
-
==============================
6.당신의 배열이 얼마나 큰에 따라 효율적인 알고리즘 O를 고려 (N N 로그) 수
당신의 배열이 얼마나 큰에 따라 효율적인 알고리즘 O를 고려 (N N 로그) 수
def equal_a(a1, a2) a1sorted = a1.sort a2sorted = a2.sort return false if a1.length != a2.length 0.upto(a1.length - 1) do |i| return false if a1sorted[i] != a2sorted[i] end end
비용 O 정리 (N 로그 N)과 각각 쌍을 확인하면 O (n)을 비용은 따라서이 알고리즘 (N, N 로그) O이다. 다른 알고리즘은 정렬되지 않은 배열을 사용하여 빠른 (점근)이 될 수 없습니다.
-
==============================
7.두 배열의 중복 요소가있는 경우 - (A2 A1) 또는 (A1 및 A2) 것하지 작업을 기반으로 대부분의 답변. 나는 단어 (배열 분할)의 모든 문자 (예 : 낙서 용) 문자 집합의 일부 있는지 확인하기 위해 방법을 찾고 여기에 도착했다. 이 답변 아무도 일하지, 그러나 이것은 수행합니다
두 배열의 중복 요소가있는 경우 - (A2 A1) 또는 (A1 및 A2) 것하지 작업을 기반으로 대부분의 답변. 나는 단어 (배열 분할)의 모든 문자 (예 : 낙서 용) 문자 집합의 일부 있는지 확인하기 위해 방법을 찾고 여기에 도착했다. 이 답변 아무도 일하지, 그러나 이것은 수행합니다
def contains_all?(a1, a2) try = a1.chars.all? do |letter| a1.count(letter) <= a2.count(letter) end return try end
from https://stackoverflow.com/questions/7387937/how-to-determine-if-one-array-contains-all-elements-of-another-array by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 루비 온 레일즈에서 코드를 넣어해야 String 클래스를 확장하는? (0) | 2020.02.07 |
---|---|
[RUBY-ON-RAILS] 테스트 문자열은 루비 온 레일즈의 숫자 인 경우 (0) | 2020.02.07 |
[RUBY-ON-RAILS] 어떻게 명시 적으로 레일에서 모델의 테이블 이름 매핑을 지정합니까? (0) | 2020.02.07 |
[RUBY-ON-RAILS] 레일 3 루비 : 클라이언트에 레일을 통해 스트리밍 데이터 (0) | 2020.02.07 |
[RUBY-ON-RAILS] 레일에서보기 당 자바 스크립트 파일 (0) | 2020.02.07 |