루비에서 한 배열을 다른 배열에서 빼기
-
19-09-2019 - |
문제
생성 및 할당 된 두 가지 작업이 있습니다. 생성 된 작업 배열에서 할당 된 모든 작업을 제거하고 싶습니다. 내 작업이지만 지저분한 코드는 다음과 같습니다.
@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
더 나은 방법이 있다고 확신합니다. 무엇입니까? 감사 :-)
해결책
루비에서 배열을 빼낼 수 있습니다.
[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 ]
세트와 같은 동작이 필요한 경우 라이브러리 클래스 세트를 참조하십시오.
참조 정렬 선적 서류 비치.
다른 팁
위의 솔루션
a - b
배열의 모든 요소 인스턴스를 삭제합니다 b
배열에서 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]
두 배열이 정렬되지 않은 경우에도 코드가 작동합니다. 예에서는 배열이 정렬되지만 필요하지 않습니다.
제휴하지 않습니다 StackOverflow