加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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改变它的行为.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读