如何在Scala中为TreeSet分配订单而不重复自己
发布时间:2020-12-16 18:19:39 所属栏目:安全 来源:网络整理
导读:我有这段 Scala代码,它定义了一个排序并将其应用于TreeSet.这部分编译得很好. val acctOrdering = new Ordering[Account] { def compare(acc1: Account,acc2: Account) { // code to compare based on various criteria }}private var accountSet = new Tree
我有这段
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 错误是“无法找到参数cmp的隐含值:订购[帐户]” 但是,如果我在要求最小值时再次指定排序对象,则编译: val firstAccount = accountSet.min(acctOrdering) 我以为它会自动使用我在构造时给出的顺序,并在我添加到集合时逐步进行排序,所以在调用min时我不必再次指定顺序. 我究竟做错了什么?我是否需要在某处明确定义隐式函数? 解决方法
发生的事情是你假设min取决于集合的顺序,但事实并非如此.具体来说,min和max是几乎任何集合都可用的泛型方法,它们采用隐式Ordering参数.
但是,如果您尝试使用特定于SortedSet的方法的firstKey和lastKey,它们将无需传递任何隐式即可工作. 编辑 您可能提出的一个问题是如何确保您的帐户类型可以通过任何期望订购的方法进行订购.你可以通过在Account的对象伴随中放置一个隐式定义来做到这一点,如下所示: object Account { implicit val ord = new Ordering[Account] { def compare(ac1: Account,acc2: Account): Int = { // code to compare based on various criteria } } } 一旦这样做,您就不需要明确地传递顺序. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容