如何解决在Scala的TreeMap中,Ordering.by_toLowerCase如何进行不区分大小写的查找?
因此,我必须实现不区分大小写的Map查找,并使用TreeMap来实现这一点:
val treeMap = TreeMap(someOtherMap.toArray: _*)(Ordering.by(_.toLowerCase))
以及treeMap.get("FOo")
和treeMap.get("foo")
返回与预期相同的结果。我的问题是,(Ordering.by(_.toLowerCase))
附加参数对get()
有何帮助?我正在看source code here,它走到RB.get(key)
。
附加的Ordering.by()
对不区分大小写的查找有何帮助?是否需要查找key
,转换为小写字母并在Map
中以小写字母查找键,然后匹配并返回值? (我知道这是非常幼稚的解释,但我似乎无法推理出相反的方式)
Scala的新手,因此尝试在此处了解其内部工作原理:)
解决方法
如果您进一步研究Red-black Tree数据结构的实现RB.get(key)
,您将在方法scala.collection.immutable.RedBlackTree#lookup
中看到以下代码
@tailrec
def lookup[A,B](tree: Tree[A,B],x: A)(implicit ordering: Ordering[A]): Tree[A,B] = if (tree eq null) null else {
val cmp = ordering.compare(x,tree.key)
if (cmp < 0) lookup(tree.left,x)
else if (cmp > 0) lookup(tree.right,x)
else tree
}
它使用ordering
来查看密钥tree.key
是否大于或小于提供的x
密钥。在您的情况下,由于ordering.compare
,0
在比较foo
和FOo
时将返回_.toLowerCase
,这将匹配树中的当前节点和最后一个节点else tree
返回与键foo
关联的值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。