Scala SortedSet – 按一个排序顺序和其他东西唯一?
发布时间:2020-12-16 19:00:59 所属栏目:安全 来源:网络整理
导读:说我有一组字符串,我想要按长度排序,但是通常的字符串唯一性是唯一的.我的意思是,我可以在Set中有多个长度相同的String,但是它们应该按长度排序. 我想表达这样的订单: val orderByLength = Ordering[Int].on[String](_ length) 我认为看起来真的很好.但是,
说我有一组字符串,我想要按长度排序,但是通常的字符串唯一性是唯一的.我的意思是,我可以在Set中有多个长度相同的String,但是它们应该按长度排序.
我想表达这样的订单: val orderByLength = Ordering[Int].on[String](_ length) 我认为看起来真的很好.但是,如果我把它抛到一个SortedSet中,就像这样: scala> val s = SortedSet("foo","bar")(orderByLength) s: scala.collection.immutable.SortedSet[java.lang.String] = TreeSet(bar) 我只得到’酒吧’.这是因为Ordering表示总排序,因此当比较返回0时,元素被认为是相同的. 因此,我想我需要做一个链接的排序,并比较字符串,如果长度相等.为了做到这一点,我使用了“pimp我的图书馆”模式,如下所示: trait ChainableOrderings { class ChainableOrdering[T](val outer: Ordering[T]) { def ifEqual(next: Ordering[T]): Ordering[T] = new Ordering[T] { def compare(t1: T,t2: T) = { val first = outer.compare(t1,t2) if (first != 0) first else next.compare(t1,t2) } } } implicit def chainOrdering[T](o: Ordering[T]) = new ChainableOrdering[T](o) } 我可以使用像: val ordering = Ordering[Int].on[String](_ length) ifEqual Ordering[String] 我以为这看起来真的很棒,但是后来我意识到,我想做的并不是按照字符串的自然顺序来排序,我只想按大小排序,但是别的东西是唯一的.这样可以以更优雅的方式吗? 解决方法
在这种情况下我做的是这样的:
val orderByLength = Ordering[(Int,String)].on[String](s => s.length -> s) 换句话说,使用一个元组得到一个破产者. 另一方面,我认为SortedSet的愚蠢可以根据其排序来考虑元素相同的元素.我以前已经讨论过了,但是我不会放弃在这个搜索邮件列表档案和scala trac上进行讨论/门票的可能性,也可能试图让SortedSet改变它的行为. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |