在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.compare0在比较fooFOo时将返回_.toLowerCase,这将匹配树中的当前节点和最后一个节点else tree返回与键foo关联的值。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...