【问题标题】:How can I sort List[Int] objects?如何对 List[Int] 对象进行排序?
【发布时间】:2013-07-03 18:56:50
【问题描述】:

我想做的是在 Scala 中对 List 对象进行排序,而不是对列表中的元素进行排序。例如,如果我有两个 Ints 列表:

val l1 = List(1, 2, 3, 7)
val l2 = List(1, 2, 3, 4, 10)

我希望能够将它们按 l1 > l2 的顺序排列。

我创建了一个案例类,它可以满足我的需要,但问题是当我使用它时,我的其他方法都不起作用。我是否需要实现类中的所有其他方法,即 flatten、sortWith 等?

我的课程代码如下所示:

class ItemSet(itemSet: List[Int]) extends Ordered[ItemSet] {

  val iSet: List[Int] = itemSet

  def compare(that: ItemSet) = {

    val thisSize = this.iSet.size
    val thatSize = that.iSet.size
    val hint = List(thisSize, thatSize).min
    var result = 0
    var loop = 0

    val ths = this.iSet.toArray
    val tht = that.iSet.toArray

    while (loop < hint && result == 0) {
      result = ths(loop).compare(tht(loop))
      loop += 1
    }
    if (loop == hint && result == 0 && thisSize != thatSize) {
      thisSize.compare(thatSize)
    } else
      result
  }

}

现在,如果我创建一个 ItemSet 数组,我可以对其进行排序:

val is1 = new ItemSet(List(1, 2, 5, 8))
val is2 = new ItemSet(List(1, 2, 5, 6))
val is3 = new ItemSet(List(1, 2, 3, 7, 10))

Array(is1, is2, is3).sorted.foreach(i => println(i.iSet))

scala> List(1, 2, 3, 7, 10)
List(1, 2, 5, 6)
List(1, 2, 5, 8)

给我带来问题的两种方法是:

def itemFrequencies(transDB: Array[ItemSet]): Map[Int, Int] = transDB.flatten.groupBy(x => x).mapValues(_.size)

我得到的错误是:

类型 Map[Nothing, Int] 的表达式不符合预期的类型 Map[Int, Int]

对于这个:

def sortListAscFreq(transDB: Array[ItemSet], itemFreq: Map[Int, Int]): Array[List[Int]] = {
  for (l <- transDB) yield
    l.sortWith(itemFreq(_) < itemFreq(_))
}

我明白了:

无法解析符号 sortWith。

有没有一种方法可以扩展 List[Int] 以便我可以对列表集合进行排序而不会失去其他方法的功能?

【问题讨论】:

    标签: scala sorting scala-2.9


    【解决方案1】:

    标准库为有序事物的集合提供了a lexicographic ordering。你可以把它放到作用域中,你就完成了:

    scala> import scala.math.Ordering.Implicits._
    import scala.math.Ordering.Implicits._
    
    scala> val is1 = List(1, 2, 5, 8)
    is1: List[Int] = List(1, 2, 5, 8)
    
    scala> val is2 = List(1, 2, 5, 6)
    is2: List[Int] = List(1, 2, 5, 6)
    
    scala> val is3 = List(1, 2, 3, 7, 10)
    is3: List[Int] = List(1, 2, 3, 7, 10)
    
    scala> Array(is1, is2, is3).sorted foreach println
    List(1, 2, 3, 7, 10)
    List(1, 2, 5, 6)
    List(1, 2, 5, 8)
    

    Ordering type class 通常比 Scala 中的 Ordered 更方便——它允许您指定一些现有类型的排序方式,而无需更改其代码或创建扩展 Ordered[Whatever] 的代理类,当您''ve 很快就会变得一团糟。

    【讨论】:

    • 非常感谢!我不敢相信我只花了 2 天的时间试图让一切正常工作。
    • @Val,我想这是讽刺,但您有点忽略了要点——列表的 array 在调用 @987654327 之前是not 排序的@,然后就是了。此外,我只是使用 OP 的示例,这通常是个好主意。
    猜你喜欢
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多