自定义订购Scala TreeMap

如何在Scala TreeMap获得自定义排序?

好吧,这让我困惑了一段时间。 答案在于隐式和接收器类型转换器的世界。

scala.collection.immutable.TreeMapscala.collection.immutable.TreeMapSortedMap 。 如果查看TreeMap的文档,您会看到它采用Ordering[T]作为隐式参数。

通常,当您声明TreeMap ,说内联,它将使用默认的Ordering对象,如下所示:

scala> val dtm = TreeMap( "a" -> 1, "bc" -> 2, "def" -> 3 )
dtm: scala.collection.immutable.TreeMap1 = Map(a -> 1, bc -> 2, def -> 3)

例如,如果要更改键的顺序,而不是将字符串内容的升序更改为字符串长度的降序,则需要使用订购类型。

scala> object VarNameOrdering extends Ordering[String] {
         def compare(a:String, b:String) = b.length compare a.length
       }
defined module VarNameOrdering

现在,您可以像这样显式使用第二个参数列表:

scala> val tm1 = TreeMap( "a" -> 1, "bc" -> 2, "def" -> 3 )( VarNameOrdering )
tm: scala.collection.immutable.TreeMap1 = Map(def -> 3, bc -> 2, a -> 1)

我们将对象传递给TreeMap ,后者Comparator没有样板实例化的Java Collection Comparator对象非常相似。 现在,TreeMap的键按字符串长度排序。 我们添加了更多元素,地图将保持有序。

val tm2 = tm1 + ( "food" -> 4 )
cala.collection.immutable.TreeMap1 = Map(food -> 4, def -> 3, bc -> 2, a -> 1)

但是,请注意,需要注意并记住映射通常以散列方式实现。

scala> val tm3 = tm2 + ( "z" -> 5 )
tm3: scala.collection.immutable.TreeMap1 = Map(food -> 4, def -> 3, bc -> 2, z -> 5)

惊讶吗 你应该。

对地图进行排序的另一种方法是仅访问键并进行排序。

scala> dtm.keys.toList.sortWith ( _.length > _.length )
res3: List1 = List(salad, def, bc, a)

scala> dtm.keys.toList.sortWith ( _.length > _.length ).map( k => ( dtm.get(k).get ))
res4: List[Int] = List(10, 3, 2, 1)

scala> dtm.keys.toList.sortWith ( _.length > _.length ).map( k => ( k, dtm.get(k).get ))
res5: List[(java.lang.String, Int)] = List((salad,10), (def,3), (bc,2), (a,1))

这可能是一个更好的解决方案,因为您并没有丢失钥匙! 考虑如何存储数据是需要尽早做出的主要决定。 您总是可以稍后决定如何编写该数据的投影。

最后,有趣的是看到Java和Scala之间的相似之处

scala> dtm.keys
res6: Iterable1 = Set(a, bc, def, salad)

scala> dtm.keys.toList
res7: List1 = List(a, bc, def, salad)

参考: Peter Pilgrim博客博客中的JCG合作伙伴 Peter Pilgrim提供的自定义订购Scala TreeMap


翻译自: https://www.javacodegeeks.com/2012/07/custom-ordering-scala-treemap.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值