Scala - weird behaviour with Iterator.toList -
i new scala , have function follows:
def selectsame(messages: bufferediterator[int]) = { val head = messages.head messages.takewhile(_ == head) } which selecting buffered iterator elems matching head. subsequently using code:
val messagestream = list(1,1,1,2,2,3,3) if (!messagestream.isempty) { var lasttimestamp = messagestream.head.timestamp while (!messagestream.isempty) { val messages = selectsame(messagestream).tolist println(messages) } upon first execution getting (1,1,1) expected, list(2), if lost 1 element down line... doing sth wrong iterators/lists, bit lost here.
scaladoc of iterator says takewhile:
reuse: after calling method, 1 should discard iterator called on, , use iterator returned. using old iterator undefined, subject change, , may result in changes new iterator well.
so that's why. means cannot directly want iterators , takewhile. imho, easiest write own recursive function that.
if want stick iterators, use sameelements method on iterator generate duplicate you'd call dropwhile.
even better: use span repeatedly:
def selectsame(messages: bufferediterator[int]) = { val head = messages.head messages.span(_ == head) } def iter(msgstream: bufferediterator[int]): unit = if (!msgstream.isempty) { val (msgs, rest) = selectsame(msgstream) println(msgs.tolist) iter(rest) } val messagestream = list(1,1,1,2,2,3,3) if (!messagestream.isempty) { var lasttimestamp = messagestream.head.timestamp iter(messagestream0 }
Comments
Post a Comment