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é?

Était-ce utile?

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 Streams 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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top