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 比较 fooFOo 因为 _.toLowerCase 并且这将匹配树和最后 else tree returns 与键 foo.

关联的值