2009-10-01 5 views
1

제목이 부족하여 죄송합니다. 나는 더 나은 것을 생각할 수 없었다. 당신이 그것을 생각한다면 편집하십시오.Scala에서 이와 같은 작업을 수행하는 방법은 무엇입니까?

두 개의 List 개의 객체가 있고 항상 변경되고 있다고 가정 해 보겠습니다. 그들은 별개의 목록으로 남을 필요가 있지만 많은 작업은 양쪽 모두에서 수행되어야합니다. 이것은 다음과 같은 일을하게합니다 :

//assuming A and B are the lists 
A.foo(params) 
B.foo(params) 

다른 말로하면, 제 코드의 많은 곳에서 두 개의 서로 다른 목록에 똑같은 연산을하고 있습니다. 명시 적으로 다른 목록을 작성하지 않고도 한 목록으로 줄이는 방법을 원합니다. 나는리스트 Ab을리스트로 합치는 것만으로도 모든 문제를 해결할 수 있지만 목록에 새 객체를 추가해야한다면 동일한 작업으로 돌아갈 수 있습니다. (왜냐하면 추가해야 할 것이기 때문입니다. 그것을 C 및 해당 목록으로).

성능이 매우 중요합니다. A을 반복하고 반복적으로 B으로 이동하는 반복기 또는 무언가를 만들 수있는 방법이 있습니까? 나는 또 다른 해결책이 조합 목록 (C)을 만들 때마다이 목록 둘 다에서 어떤 종류의 기능을 수행하고자 할 때마다 알지만 시간 낭비라고 할 수 있습니다.

답변

4

반복자는 당신이 여기에서 필요로하는 무슨이다 :

scala> var listA :List[Int] = Nil 
listA: List[Int] = List() 

scala> var listB :List[Int] = Nil 
listB: List[Int] = List() 

scala> def dealWith(op : List[Int] => Unit){ op(listA); op(listB) } 
dealWith: ((List[Int]) => Unit)Unit 

및 중고 장비 구매 및 listB 모두의 연산자를 수행하려면 다음, 당신은 다음과 같이 사용할 수 있습니다 어쨌든,이 내 솔루션입니다. 리스트를 반복자로 바꾸고 2 개의 반복자를 연결하는 것은 모두 O (1) 연산입니다.

scala> val l1 = List(1, 2, 3) 
l1: List[Int] = List(1, 2, 3) 

scala> val l2 = List(4, 5, 6) 
l2: List[Int] = List(4, 5, 6) 

scala> (l1.iterator ++ l2.iterator) foreach (println(_)) // use List.elements for Scala 2.7.* 
1 
2 
3 
4 
5 
6 
+0

사소한 수정. iterator를 얻으려면 : (l1.elements ++ l2.elements). OP가 분명히 원하는 것처럼 Iterator 솔루션은 변경 가능 목록과 함께 사용할 수 없습니다. 또한 Scala 라이브러리의 Iterator는 한 번만 사용하는 것으로 보입니다. 되감기해서 다시 사용할 수 없습니다. 그러나, upvoting 원인, 반복기는 여기에 갈 수있는 방법이지만, 아마 scala 라이브러리 버전이 아닙니다. – HRJ

+0

감사합니다. HRJ의 아이디어 (요소)를 사용했습니다. – ryeguy

+1

@HRJ @ryeguy 그래서 foreach 문 다음에 오는 주석은 ;-) List.elements는 Scala 2.8.0에서 더 이상 사용되지 않습니다. 대신 iterator를 사용하십시오. –

2

나는 당신의 의미가 무엇인지 잘 모르겠다.

scala> listA ::= 1 
scala> listB ::= 0 
scala> dealWith{ _ foreach println } 
1 
0 
관련 문제