2011-09-24 8 views
0

저는 루비를 처음 접했습니다. 몇 시간 동안 인터넷 검색을 해왔지만이 것을 이해할 수는 없습니다. 정말 쉽지 않아서 꽤 좌절하게 될 것 같습니다.두 개의 기호 배열을 비교하는 중

저는 루비에서 작업 중이며 true 또는 false 반환을 위해 2 개의 기호 배열을 비교해야합니다.

array1 = [:a, :c] 
array2 = [:a, :b, :c] 

내가해야 할 비교, 배열 2가하는 array1의 모든 요소가 포함되어 있는지 확인하는 것입니다. 이 경우 array2는 array1을 포함하지만 array1에는 array2가 포함되지 않습니다.

나는 시도했다 : 그것은 비교 문자열로 변환해야하기 때문에 그들이 동일한 순서에있는 경우에만 true를 돌려

array2.to_s.include?(array1.to_s) 

합니다. 그래서 그것은 false를 반환합니다 (내가 뭘 찾고있는 건 아니지만) array2 = [: a, : c, : b] 사실 일 것입니다. 이 비교를하는 더 적절한 방법이 있습니까?

답변

1

venj의 대답은 작은 배열에서는 좋지만 큰 배열에서는 잘 수행되지 않을 수도 있습니다. 기본적으로 Set 연산 ("Set (array1) Set (array2)의 하위 집합입니까?")이므로 Ruby 자신의 Set library이이 작업을 수행하는지 확인하는 것이 좋습니다. 설정은 subset? method을 가지고 있으며, 소스에서 슬쩍 복용 우리는 짧고 달콤한 볼 :

def subset?(set) 
    set.is_a?(Set) or raise ArgumentError, "value must be a set" 
    return false if set.size < size 
    all? { |o| set.include?(o) } 
end 

우리는 단지 배열에서 두 세트의 객체를 생성하고 하루에 전화 할 수 있지만, 증류 할만큼 쉽다

array1 = [:a, :c] 
array2 = [:a, :b, :c] 

array1.length < array2.length && array1.all? {|el| array2.include? el } 
# => true 

array1 << :z 
array1.length < array2.length && array1.all? {|el| array2.include? el } 
# => false 
+0

내가 찾고있는 대상입니다. 감사합니다. 내가 찾지 못했던 간단한 절차가 있어야한다는 것을 알았습니다. –

1

-를 사용할 수 있습니다. 예 :

array1 - array2 #=> returns empty array, if array2 include all array1 elements. 

희망 사항이 문제를 해결할 수 있습니다.

0

이 메서드를 Array 클래스에 추가 할 수 있습니다.

#!/usr/bin/env ruby 

class Array 
    def includes_other(arr) 
    raise "arr must be an Array" unless arr.kind_of? Array 
    return (arr - self).length == 0 
    end 
end 

arr1 = [:a, :c, :e] 
arr2 = [:e, :a, :c, :d] 

puts arr2.includes_other(arr1) # prints true 

arr3 = [:x, :c, :e] 

puts arr3.includes_other(arr1) # prints false 
+0

또한 매우 흥미로운 접근 방법입니다. 나는 그걸로 놀아야 만 할거야. –

관련 문제