2009-10-01 7 views
1

Désolé pour l'absence d'un titre descriptif; Je ne pouvais pas penser à quelque chose de mieux. Modifiez-le si vous en pensez un. Disons que j'ai deux List s d'objets, et ils changent tout le temps. Ils doivent rester en tant que listes séparées, mais de nombreuses opérations doivent être effectuées sur les deux. Cela me conduit à faire des choses comme:Comment faire quelque chose comme ça dans Scala?

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

En d'autres termes, je fais exactement la même opération à deux listes différentes à de nombreux endroits dans mon code. Je voudrais un moyen de les réduire à une liste sans explicitement avoir à construire une autre liste. Je sais que la seule combinaison des listes A et b dans une liste C résoudrait tous mes problèmes, mais alors nous serions juste de retour à la même opération si j'avais besoin d'ajouter un nouvel objet à la liste (parce que je devrais ajouter à C ainsi que sa liste respective).

C'est dans une boucle serrée et la performance est très importante. Y a-t-il un moyen de construire un itérateur ou quelque chose qui va itérer A et ensuite passer à B, tous de manière transparente? Je sais qu'une autre solution consisterait à construire la liste combinée (C) chaque fois que je voudrais effectuer une sorte de fonction sur ces deux listes, mais c'est une énorme perte de temps (en termes de calcul).

Répondre

4

Iterator est ce que vous avez besoin. Transformer une liste en un itérateur et concaténer 2 itérateurs sont les deux opérations 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

Correction mineure. Pour obtenir l'itérateur: (l1.elements ++ l2.elements). La solution Iterator ne peut cependant pas être utilisée avec des listes modifiables, comme l'OP le souhaite apparemment. De plus, l'Iterator de la librairie Scala semble être à usage unique. Vous ne pouvez pas le rembobiner et le réutiliser. Pourtant, cause d'upvoting, l'itérateur est le chemin à parcourir ici, mais probablement pas la version de la bibliothèque de scala. – HRJ

+0

Cela fonctionne très bien, merci. J'ai utilisé l'idée de HRJ (éléments). – ryeguy

+1

@HRJ @ryeguy C'est pourquoi le commentaire suivant l'instruction foreach ;-) List.elements est déconseillé dans Scala 2.8.0, utilisez plutôt itérateur. –

2

Je ne sais pas si je comprends ce que vous voulez dire. Quoi qu'il en soit , voici ma solution:

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 

et si vous souhaitez effectuer un opérateur dans les deux listeA et listeB, vous pouvez utiliser comme suit:

scala> listA ::= 1 
scala> listB ::= 0 
scala> dealWith{ _ foreach println } 
1 
0 
Questions connexes