Partitionner un itérateur scala 2.7.5
-
19-09-2019 - |
Question
Il semble que il n'y a pas de méthode de partition
sur un Iterator
dans scala 2.7.5 (il est en 2.8). Je voudrais avoir une partition sans perdre la paresse de la Iterator
, de sorte que le suivant est pas une option:
itr.toList.partition( someTest(_) )
Quelqu'un peut-il recommander une façon de le faire sans mettre en œuvre ma propre méthode de partition
? Par exemple, est-il un moyen de convertir un Iterator
en Stream
paresseusement-évalué?
La solution
Avez-vous essayé Stream.fromIterator
méthode ? Elle produit un courant contenant les éléments de l'itérateur suivant:.)
Un exemple serait:
val iter = List(1,2,3,4).elements // just a simple iterator
val str = Stream.fromIterator(iter)
str.partition(_ >= 3)
it helps (et il est la chose que vous aviez en tête).
EDIT:. Juste un exemple pour montrer que c'est paresseux (et memoised - comme tous Stream
s sont)
scala> val iter = new Iterator[Int] {
| var lst = List(1,2,3,4)
| def hasNext() = !lst.isEmpty
| def next() = { val x = lst.head; println(x); lst = lst.tail; x }
| }
scala> val stream = Stream.fromIterator(iter)
1
stream: Stream[Int] = Stream(1, ?)
scala> stream.partition(_ >= 2)
2
3
4
res1: (Iterable[Int], Iterable[Int]) = (ArrayBuffer(2, 3, 4),ArrayBuffer(1))
scala> stream.partition(_ >= 3)
res2: (Iterable[Int], Iterable[Int]) = (ArrayBuffer(3, 4),ArrayBuffer(1, 2))
NB:. Laissé une sortie comme il était assez bavard
- Flaviu Cipcigan