Returning original collection type in generic method

前端 未结 3 458
滥情空心
滥情空心 2020-12-01 07:06

Say we want to make a function like minBy that returns all elements of equal minimalism in a collection:

def multiMinBy[A, B: Ordering](xs: Trav         


        
3条回答
  •  情深已故
    2020-12-01 07:16

    How about using CanBuildFrom?

    import scala.collection.immutable._
    import scala.collection.generic._
    
    def multiMinBy[A, B, From[X] <: Traversable[X], To](xs: From[A])(f: A => B)
      (implicit ord: Ordering[B], bf: CanBuildFrom[From[_], A, To])  = {
      val minVal = f(xs minBy f)
      val b = bf()
      b ++= (xs filter (f(_) == minVal))
      b.result
    } 
    
    
    
    scala> multiMinBy(List("zza","zzza","zzb","zzzb"))(_.last)
    res1: List[java.lang.String] = List(zza, zzza)
    

提交回复
热议问题