【问题标题】:Scala troubles with sortingScala 的排序问题
【发布时间】:2015-04-22 07:20:52
【问题描述】:

当谈到 scala 时,我仍在学习期间,并面临一些我想解决的问题。

我目前拥有的是 X 类型的项目的 Seq。现在我想创建一个函数,该函数返回一个数字映射,该映射与在该原始 seq 上出现一定时间的项目集映射。

这是我想做的小例子:

val exampleSeq[X]: Seq = [a, b, d, d, c, b, d]
val exampleSeq2[x]: Seq = [a, a, a, c, c, b, b, c]

myMagicalFunction(exampleSeq) returns Map[1 -> Set[a, c], 2 -> Set[b], 3 -> Set[d]]

myMagicalFunction(exampleSeq2) returns Map[2 -> Set[b], 3 -> Set[a, c]]

到目前为止,我已经能够创建一个函数,将项目与其出现的时间进行映射:

function[X](seq: Seq[X]) = seq.groupBy(item => item).mapValues(_.size)

从那个返回我的 exampleSeq 是

Map(a -> 1, b -> 2, c -> 1, d -> 3) 

谢谢你的回答:)

【问题讨论】:

  • 非常感谢您的每一个回答。我想我现在能够解决它:)
  • 我不明白的是问题的标题,排序是怎么回事?这个问题更多地与计数有关。为了后代,也许使用更具体的标题?

标签: scala sorting seq


【解决方案1】:

一种方法,用于

val a = Seq('a', 'b', 'd', 'd', 'c', 'b', 'd')

这个

val b = for ( (k,v) <- a.groupBy(identity).mapValues(_.size).toArray ) 
        yield (v,k)

交付

Array((2,b), (3,d), (1,a), (1,c))

等等

b.groupBy(_._1).mapValues(_.map(_._2).toSet)
res: Map(2 -> Set(b), 1 -> Set(a, c), 3 -> Set(d))

注意seq.groupBy(item =&gt; item) 等价于seq.groupBy(identity)

【讨论】:

    【解决方案2】:

    你快到了!从集合element -&gt; count出发,只需转换即可到达count -&gt; Col[elem]

    假设freqItem = Map(a -&gt; 1, b -&gt; 2, c -&gt; 1, d -&gt; 3) 你会这样做:

    val freqSet = freqItem.toSeq.map(_.swap).groupBy(_._1).mapValues(_.toSet)
    

    请注意,我们在将 (k,v) 交换为 (v,k) 之前将 Map 转换为 Seq,因为 Map 上的映射保留了键唯一性的语义,否则您将丢失 (1 -&gt; a), (1 -&gt; b) 之一。

    【讨论】:

      【解决方案3】:

      你可以把你的函数写成:

      def f[T](l: Seq[T]): Map[Int, Set[T]] = {
          l.map {
            x => (x, l.count(_ == x))
          }.distinct.groupBy(_._2).mapValues(_.map(_._1).toSet)
        }
      
      val l = List("a","a","a","b","b","b","b","c","c","d","e")
      f(l)
      res0: Map[Int,Set[String]] = Map(2 -> Set(c), 4 -> Set(b), 1 -> Set(d, e), 3 -> Set(a))
      
      
      scala> case class A(name:String,age:Int)
      defined class A
      
      scala> val l = List(new A("a",1),new A("b",2),new A("a",1),new A("c",1) )
      l: List[A] = List(A(a,1), A(b,2), A(a,1), A(c,1))
      
      scala> f[A](l)
      res1: Map[Int,Set[A]] = Map(2 -> Set(A(a,1)), 1 -> Set(A(b,2), A(c,1)))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-20
        • 2013-06-04
        • 1970-01-01
        相关资源
        最近更新 更多