@@ -253,34 +253,30 @@ class TraversableExtensionMethods[A](private val self: c.Traversable[A]) extends
253
253
class TraversableLikeExtensionMethods [A , Repr ](private val self : c.GenTraversableLike [A , Repr ])
254
254
extends AnyVal {
255
255
256
- def groupMap [K , B , VThat , That ](key : A => K )(f : A => B )(
257
- implicit traversable : IsTraversableLikeAux [A , Repr ],
258
- innerBf : CanBuildFrom [Repr , B , VThat ],
259
- outerBf : CanBuildFrom [c.GenMap [K , Repr ], (K , VThat ), That ]): That = {
260
- val grouped = self.groupBy(key)
261
- val outerB = outerBf(grouped)
262
- for ((k, repr) <- grouped.toIterator) {
263
- val innerB = innerBf(repr)
264
- for (a <- traversable.conversion(repr)) innerB += f(a)
265
- outerB.+= ((k, innerB.result()))
256
+ def groupMap [K , B , That ](key : A => K )(f : A => B )(
257
+ implicit bf : CanBuildFrom [Repr , B , That ]): Map [K , That ] = {
258
+ val map = m.Map .empty[K , m.Builder [B , That ]]
259
+ for (elem <- self) {
260
+ val k = key(elem)
261
+ val bldr = map.getOrElseUpdate(k, bf(self.repr))
262
+ bldr += f(elem)
266
263
}
267
- outerB.result()
264
+ val res = Map .newBuilder[K , That ]
265
+ for ((k, bldr) <- map) res += ((k, bldr.result()))
266
+ res.result()
268
267
}
269
268
270
- def groupMapReduce [K , B , That ](key : A => K )(f : A => B )(reduce : (B , B ) => B )(
271
- implicit traversable : IsTraversableLikeAux [A , Repr ],
272
- bf : CanBuildFrom [c.GenMap [K , Repr ], (K , B ), That ]): That = {
273
- val grouped = self.groupBy(key)
274
- val b = bf(grouped)
275
- for ((k, repr) <- grouped.toIterator) {
276
- val elem = traversable
277
- .conversion(repr)
278
- .toIterator
279
- .map(f)
280
- .reduce(reduce)
281
- b.+= ((k, elem))
269
+ def groupMapReduce [K , B ](key : A => K )(f : A => B )(reduce : (B , B ) => B ): Map [K , B ] = {
270
+ val map = m.Map .empty[K , B ]
271
+ for (elem <- self) {
272
+ val k = key(elem)
273
+ val v = map.get(k) match {
274
+ case Some (b) => reduce(b, f(elem))
275
+ case None => f(elem)
276
+ }
277
+ map.put(k, v)
282
278
}
283
- b.result()
279
+ map.toMap
284
280
}
285
281
}
286
282
0 commit comments