gpt4 book ai didi

scala - 如何在 Scala 中为 TreeSet 分配顺序而不重复我自己

转载 作者:行者123 更新时间:2023-12-04 22:51:10 27 4
gpt4 key购买 nike

我有这段 Scala 代码,它定义了一个排序并将其应用于一个 TreeSet。这部分编译得很好。

val acctOrdering = new Ordering[Account] {
def compare(acc1: Account, acc2: Account) {

// code to compare based on various criteria

}
}

private var accountSet = new TreeSet[Account]()(acctOrdering)

在代码的其他地方,我想根据我之前的顺序获取集合中的第一个元素(如果第一个元素没有产生我想要的东西,则稍后获取后续元素,尽管这通常不是必需的)指定的。我认为以下内容会起作用,但它没有编译:
val firstAccount = accountSet.min

错误是 "could not find implicit value for parameter cmp: Ordering[Account]"
但是,如果我在要求最小值时再次指定排序对象,它将编译:
val firstAccount = accountSet.min(acctOrdering)

我认为它会自动使用我在构建时给出的排序,并在我添加到集合时递增排序,因此在调用 min 时我不必再次指定排序。 .

我究竟做错了什么?我需要在某处显式定义一个隐式函数吗?

最佳答案

发生的事情是您假设 min取决于集合的顺序,但事实并非如此。具体来说,minmax是几乎所有集合上都可用的泛型方法,它们采用隐式 Ordering范围。

但是,如果您尝试 firstKeylastKey , 分别是 SortedSet - 特定的方法,它们无需传递任何隐式即可工作。

编辑

您可能提出的一个问题是如何确保您的 Account类型可以通过任何期望 Ordering 的方法进行排序。 .您可以通过在 Account 中放置一个隐式定义来做到这一点。的对象伴侣,像这样:

object Account {
implicit val ord = new Ordering[Account] {
def compare(ac1: Account, acc2: Account): Int = {
// code to compare based on various criteria
}
}
}

一旦你这样做了,你就不需要明确地传递排序了。

关于scala - 如何在 Scala 中为 TreeSet 分配顺序而不重复我自己,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5452601/

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