gpt4 book ai didi

scala - 如何对 List[Int] 对象进行排序?

转载 作者:行者123 更新时间:2023-12-04 05:39:45 24 4
gpt4 key购买 nike

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

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

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

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

我的类(class)代码如下所示:
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)

我得到的错误是:

Expression of type Map[Nothing, Int] doesn't conform to expected type Map[Int, Int]



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

我得到:

Cannot resolve symbol sortWith.



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

最佳答案

标准库提供 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往往比 Ordered更方便在 Scala 中——它允许你指定一些现有类型应该如何排序,而无需更改其代码或创建扩展 Ordered[Whatever] 的代理类。 ,正如您所见,这会很快变得困惑。

关于scala - 如何对 List[Int] 对象进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17492824/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com