Ordering.by(_.toLowerCase) 如何在 Scala 的 TreeMap 中进行不区分大小写的查找?
How does Ordering.by(_.toLowerCase) work for a case insensitive lookup in a TreeMap in Scala?
因此,我必须对 Map 执行不区分大小写的查找,我使用 TreeMap 来实现此目的:
val treeMap = TreeMap(someOtherMap.toArray: _*)(Ordering.by(_.toLowerCase))
和 treeMap.get("FOo")
和 treeMap.get("foo")
return 与预期的结果相同。我的问题是,(Ordering.by(_.toLowerCase))
附加参数如何帮助 get()
?我正在查看 source code here,它显示为 RB.get(key)
。
额外的 Ordering.by()
如何准确地帮助不区分大小写的查找?它是否需要查找 key
,转换为小写,并以小写形式查找 Map
中的键,然后匹配和 return 值? (非常幼稚的解释,我知道,但我似乎无法推理其他原因)
Scala 新手,因此试图了解这里的内部工作方式:)
如果您更深入地研究 RB.get(key)
,它是 Red-black Tree 数据结构的实现,您将在方法 scala.collection.immutable.RedBlackTree#lookup
[=24= 中看到以下代码]
@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
将 return 0
比较 foo
和 FOo
因为 _.toLowerCase
并且这将匹配树和最后 else tree
returns 与键 foo
.
关联的值
因此,我必须对 Map 执行不区分大小写的查找,我使用 TreeMap 来实现此目的:
val treeMap = TreeMap(someOtherMap.toArray: _*)(Ordering.by(_.toLowerCase))
和 treeMap.get("FOo")
和 treeMap.get("foo")
return 与预期的结果相同。我的问题是,(Ordering.by(_.toLowerCase))
附加参数如何帮助 get()
?我正在查看 source code here,它显示为 RB.get(key)
。
额外的 Ordering.by()
如何准确地帮助不区分大小写的查找?它是否需要查找 key
,转换为小写,并以小写形式查找 Map
中的键,然后匹配和 return 值? (非常幼稚的解释,我知道,但我似乎无法推理其他原因)
Scala 新手,因此试图了解这里的内部工作方式:)
如果您更深入地研究 RB.get(key)
,它是 Red-black Tree 数据结构的实现,您将在方法 scala.collection.immutable.RedBlackTree#lookup
[=24= 中看到以下代码]
@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
将 return 0
比较 foo
和 FOo
因为 _.toLowerCase
并且这将匹配树和最后 else tree
returns 与键 foo
.