생성 및 할당 된 두 가지 작업 배열이 있습니다. 생성 된 작업 배열에서 할당 된 모든 작업을 제거하고 싶습니다. 내 작업이지만 지저분한 코드는 다음과 같습니다.
@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]
코드는 두 배열이 정렬되지 않은 경우에도 작동합니다. 이 예에서는 배열이 정렬되지만 필수는 아닙니다.