2010-12-11 6 views
15

ListBuffer가 있습니다. 특정 조건을 충족하는 모든 요소를 ​​제거하고 싶습니다.scala 조건을 만족하는 ListBuffer의 모든 요소를 ​​제거합니다.

나는 그것을 반복하고 각 요소를 제거 할 수 있습니다. 하지만 스칼라가 반복하는 목록을 돌연변이 화하는 것에 대해 말하는 것은 무엇입니까? 작동합니까, 아니면 잘못된 요소를 삭제할 것인가/모든 요소를 ​​반환하지 않을까요? (REPL을 사용한 빠른 시도는 그렇습니다. 엉망이 될 것입니다.)

더 이상 찾지 못할 때까지 반복적으로 찾기를 수행하여 찾은 요소를 제거 할 수 있지만 비효율적이라고 생각합니다.

.filter는 요소가없는 새로운 ListBuffer를 반환하지만 장소에서이를 수행하려고합니다.

def --= (xs: TraversableOnce[A]) : ListBuffer.this.type 
Removes all elements produced by an iterator from this list buffer. 

유망 보이지만 꽤

내가 이걸 어떻게해야합니까

여기를 사용하는 방법을 볼 수없는 이유는 무엇입니까?

+0

참조 http://stackoverflow.com/questions/2803085/iterators-for-mutable-collections-in-scala –

답변

5

. --=(xs: TraversableOnce[A])의 구현은 (확장 된 형태로, 실제 코드를보다 컴팩트)이다

xs foreach (x => this -= x) ; this 

(즉, 그것의 n는 원래 목록의 길이 O(n*m) 한 번에 그 일을하는만큼 비효율적 인 m은 제거 할 항목 수입니다.)

일반적으로 변경 가능한 모음에는 변경 불가능한 모음으로 완전하고 강력한 일련의 메서드가 없습니다. (즉, 불변 컬렉션에 사용 된 훌륭한 방법이 있지만 자신의 컬렉션은 비교적 적습니다.)

매우 작은 숫자를 개 제거하지 않는 한, 생성하는 목록을 필터링하는 것이 좋습니다. 새로운 것.

+3

"변경 가능한 모음에는 변경 불가능한 모음으로 완전하고 강력한 일련의 메소드가 없습니다." 예. 이것은 유감이다. 함수형 프로그래밍은 훌륭 할 수 있지만 때로는 가변적 인 데이터 구조가 실제로 내가 원하는 것이며 다중 목적 전용 연산에 대한 상대적으로 빈약 한 지원은 조금 실망 스럽다. –

6

당신은이 둘을 결합하여 다음을 수행 할 수 있습니다 : 당신은 불행하게도, 효율적으로이 작업을 수행 할 수

val lb = ListBuffer(1,2,3,4,5,6) 
lb --= lb.filter(_ % 2 == 0) 

println(lb) 
// outputs: ListBuffer(1, 3, 5) 
+0

완벽한. 아마도 바보가 될지 모르지만 그 일이 어떻게 생겨나나요? 필터가 목록이 아닌 반복자를 반환합니까? 또는 TraversableOnce는리스트가 - =에 대한 반복자로서 충분하다는 것을 의미합니까? –

+0

'TraversableOnce'는 반복자보다 더 일반적입니다. 이것은'Traversable' (모든 컬렉션이 기반으로 함)과'Iterator'의 공통 수퍼 클래스입니다. –

+0

http://www.scala-lang.org/docu/files/collections-api/collections.html –

관련 문제