i have following code splits array array of arrays before element satisfies predicate p. type checks:
def splitbefore[t](a: array[t], p: (t) => boolean) (implicit tct: classtag[t]): array[array[t]] = a.foldleft(array[array[t]](array.empty[t])) { (acc: array[array[t]], s: t) => if (p(s)) acc :+ array(s) else acc.init :+ (acc.last :+ s) } it works fine when call non-empty a:
scala> splitbefore(array("a", "bc", "d"), (s: string) => s.size > 1) res1: array[array[string]] = array(array(a), array(bc, d)) but when call empty array, classcastexception:
scala> splitbefore(array.empty[string], (s: string) => s.size > 1) java.lang.classcastexception: [ljava.lang.object; cannot cast [[ljava.lang.string; ... 33 elided when hand-inline call there no type parameterization, works fine:
scala> array().foldleft(array(array.empty[string])) { | (acc: array[array[string]], s: string) => if (s.size > 1) | acc :+ array(s) | else | acc.init :+ (acc.last :+ s) | } res1: array[array[string]] = array(array()) any idea what's going on here? i'm using scala 2.11.7.
looks instantiating nested array causes bug - crashes on such small example:
def instantiate[a](ununsed_arg: array[t])(implicit tag: classtag[a]) = array[array[a]](array.empty[a]) as quick workaround, might use arraybuilder create array:
def instantiate[t](a: array[t])(implicit ctc: classtag[t]) = { val builder = arraybuilder.make[array[t]] builder += array.empty[t] builder.result } also please note snippet directly appends elements array, bad idea because has create new array 1 more slot , copy element. looks should either use arraybuilder or arraybuffer processing or build new data structure out of lists , convert them arrays @ end.
Comments
Post a Comment