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

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

    @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

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



답변

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을 참조하십시오.

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


답변

위의 솔루션

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]

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


답변