2016-07-22 1 views
0

변경 가능한 Set 클래스를보고 있는데 union, intersect, diff 등을 참조하십시오. 이러한 모든 집합 연산은 새로운 Set을 생성합니다. 새로운 것을 만드는 대신 Set을 업데이트 할 방법이 있는지 궁금했습니다. 그렇지 않으면 val에서 var으로 전환해야합니다. 추가 단계를 수행해야합니다.스칼라 : 컬렉션을 업데이트하는 작업을 설정 하시겠습니까?

명확하지 않은 경우 .NET의 HashSet 클래스를 고려하십시오. 컬렉션을 수정하는 IntersectWith, ExceptWithUnionWith이 있습니다. LINQ 확장 메서드 Intersect, ExceptUnion이 새 컬렉션을 만드는 반면. "With"변종과 동일한 것을 찾고 싶습니다. 이 작업을 수행하는 것이 더 효율적 것, 분명히

val temp = original.diff(other) 
original.clear() 
original ++= temp 

:

여기 처음부터 컬렉션을 재 구축 비효율적 인 접근 방식

for (value <- other if original.contains(value)) { 
    original.remove(value) 
} 
+0

'var'을'val'로 바꾸는 것은 어쩌면 가능합니까? :) – Alec

+0

아니,'val'을'var'. 동일한 컬렉션에 동일한 참조를 유지하려고합니다. 새 컬렉션에 대한 참조를 바꾸지 않고 해당 컬렉션을 변경하려고합니다. –

+0

제 잘못입니다. 맞아. 변경 가능한 집합에 대한 'val'. 신기한 실수. – Alec

답변

2

참조 : 예를 들어 http://docs.scala-lang.org/overviews/collections/sets.html#operations-in-class-mutableset

:

추가 : xs + = x 부작용으로 xs를 설정하는 요소 x를 추가하고 은 xs 자체를 반환합니다.

따라서 반환 된 값을 무시하십시오. 세트가 제자리에서 업데이트되어야합니다.

+0

원래'Set'이 더 이상 다른 세트의 값을 포함하지 않도록'diff'를 가져 가고 싶다고 상상해보십시오. 원본 컬렉션은 축소되어야합니다. 삭제가 필요한 요소를 찾은 다음 원본 세트에서 제거해야 할 요소를 찾아야합니다. 수행원? –

+2

글쎄 그게 네가 물어 보지 않은거야 :-) 네가 원하는 효과를 가져야하는 항목의 순서를'= ='할 수있다. '- ='는 집합에 포함되지 않은 항목에는 효과가 없어야합니다. –

관련 문제