Ruby에서 하나의 배열을 다른 배열에서 빼기


82

생성 및 할당 된 두 가지 작업 배열이 있습니다. 생성 된 작업 배열에서 할당 된 모든 작업을 제거하고 싶습니다. 내 작업이지만 지저분한 코드는 다음과 같습니다.

    @assigned_tasks = @user.assigned_tasks
    @created_tasks = @user.created_tasks

    #Do not show created tasks assigned to self
    @created_not_doing_tasks = Array.new
    @created_tasks.each do |task|
        unless @assigned_tasks.include?(task)
            @created_not_doing_tasks << task
        end
    end

더 나은 방법이 있다고 확신합니다. 뭐야? 감사 :-)


나는 내부적으로 대답은 당신이 거기에서 코딩 한 것을하고 있다고 확신합니다.
baash05

답변:


175

Ruby에서 배열을 뺄 수 있습니다.

[1,2,3,4,5] - [1,3,4]  #=> [2,5]

ary-other_ary → new_ary 어레이 차이

other_ary에도 나타나는 모든 항목을 제거하여 원래 배열의 복사 본인 새 배열을 반환합니다. 순서는 원래 배열에서 유지됩니다.

해시와 eql을 사용하여 요소를 비교합니까? 효율성을위한 방법.

[ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ] #=> [ 3, 3, 5 ]

집합과 유사한 동작이 필요한 경우 라이브러리 클래스 Set을 참조하십시오.

어레이 설명서를 참조하십시오 .


2
Arg. 나를위한 큰 얼굴 손바닥 순간. 어떤 이유로 나는 그것이 물체와 함께 작동하지 않을 것이라고 생각했습니다. 잘 했어요-감사합니다!
doctororange

28
주의해서 IRB에서 먼저 테스트하십시오. 예 : [5, 5, 5, 5]-[5, 5] = [] ... 빼기는 배열에서 고유 한 요소를 제거합니다.
hagope 2011-08-10

9
또한 이것은 작동하지 않습니다 : [1,2]-[1,2,3] => []. 하지만 [1,2,3]-[1,2] => [3]. 아아.
Zabba

17
빼기의 관점에서 생각한다면 이 마지막 "잘못"은 실제로 의미가 있습니다. 하기 빼기 당신이 요구되지 않는 것을 사랑하는를 ... 당신은 Y가되지도 X에 뭔가가있는 경우, 결과는 일종의 '정의', 따라서 여분의 Y 요소 같으면입니다 ... X에서 Y를 뺄 요구하고있다 X- 결과에 포함되지 않습니다.
Bane

2
구체적으로 Array#-는 세트 차이입니다. 결합 (set operation이 아님) Array#|보다 더 많은 집합 공용체 Array#+입니다.
ymbirtt 2015 년

9

위의 솔루션

a - b

array b에서 array 의 모든 요소 인스턴스를 삭제합니다 a.

[ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ]  #=>  [ 3, 3, 5 ]

어떤 경우에는 결과가 [1, 2, 3, 3, 5] . 즉, 모든 중복 항목을 삭제하는 것이 아니라 요소를 개별적으로 삭제하고 싶지 않습니다.

당신은 이것을 달성 할 수 있습니다

class Array
  def delete_elements_in(ary)
    ary.each do |x|
      if index = index(x)
        delete_at(index)
      end
    end
  end
end

테스트

irb(main):198:0> a = [ 1, 1, 2, 2, 3, 3, 4, 5 ]
=> [1, 1, 2, 2, 3, 3, 4, 5]
irb(main):199:0> b = [ 1, 2, 4 ]
=> [1, 2, 4]
irb(main):200:0> a.delete_elements_in(b)
=> [1, 2, 4]
irb(main):201:0> a
=> [1, 2, 3, 3, 5]

코드는 두 배열이 정렬되지 않은 경우에도 작동합니다. 이 예에서는 배열이 정렬되지만 필수는 아닙니다.


delete_elements_inRuby 적절한 (ruby 2.6.3p62)에서는 사용할 수 없습니다.
qaisjp

@qaisjp, 작가가 정의하기 때문입니다. 당신도 그것을 정의해야합니다. 테스트 코드 위의 코드를보십시오.
ismailarilik

분명히 읽을 수 없습니다. 감사합니다, @ismailarilik.
qaisjp
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.