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

Popular posts from this blog

php - Why I am getting the Error "Commands out of sync; you can't run this command now" -

linux - Does gcc have any options to add version info in ELF binary file? -

java - Are there any classes that implement javax.persistence.Parameter<T>? -