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

scala – 如何将Map [A??,B]转换为按字符串排序的键值字符串?

发布时间:2020-12-16 09:49:44 所属栏目:安全 来源:网络整理
导读:假设我有一张地图: val m = Map("foo" - 10,"bar" - 5) 我想将其转换为以下格式的字符串(键和值用“:”分隔,不同的元素用“,”分隔): "bar:5,foo:10" 请注意,现在订购了密钥. 如何编写函数来执行此转换?我试过了 def f[A,B](m: Map[A,B]): String = { m.
假设我有一张地图:

val m = Map("foo" -> 10,"bar" -> 5)

我想将其转换为以下格式的字符串(键和值用“:”分隔,不同的元素用“,”分隔):

"bar:5,foo:10"

请注意,现在订购了密钥.

如何编写函数来执行此转换?我试过了

def f[A,B](m: Map[A,B]): String = {
  m.toList.sortBy(_._1).map { x => x._1 + ":" + x._2 }.mkString(",")
}

但这不起作用,因为不知何故,我需要指定A是可订购的.我不知道该怎么做 – 我尝试在我的函数中添加一个隐式的Orderer参数,但它没有用.

解决方法

使用Ordering类型类:

def f[A: Ordering,")
}

这会使用隐式Ordering参数向f添加另一个参数列表.方法签名实际上是在场景后面翻译的:

def f[A,B])(implicit evidence: Ordering[A]): String

然后,sortBy选取证据参数并用于比较元素.

编辑:

请注意,您不能以与订购相同的方式使用Ordered. Ordered trait旨在与将要排序的对象类型(如Java中)混合在一起.换句话说,A必须扩展Ordered [A]然后你会把它写成A&lt ;:Ordered [A].

但是,使用Ordered的这种继承方法不如使用Ordering的类型类方法强大,因为它不太灵活.如果其他人定义了A并且没有决定使它扩展Ordered [A],那么你将无法将它与sortBy一起使用(至少在没有创建包装类的情况下).另一方面,您始终可以在范围内声明新的隐式排序[A],而无需更改A继承的内容,并以您喜欢的任何方式实现此排序.这允许您在A的实现者忘记这样做时定义A类对象的排序方式,并在需要非默认排序时重新定义它们的排序方式.

(编辑:李大同)

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

    推荐文章
      热点阅读