微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

实现在Scala中执行不区分大小写的比较的字符串类

我有很多类,其字段是不区分大小写的,我想将这些类的实例放入HashMaps中,并通过字符串不区分大小写来查找它们.

每次我想通过字符串索引实例,或者通过字符串查找实例时,我不是使用toLowerCase,而是尝试将此逻辑封装在CaseInsensitiveString类中:

/** Used to enable us to easily index objects by string,case insensitive
 * 
 * Note: this class preservse the case of your string!
 */
class CaseInsensitiveString ( val _value : String ) {
  override def hashCode = _value.toLowerCase.hashCode
  override def equals(that : Any) = that match {
    case other : CaseInsensitiveString => other._value.toLowerCase ==_value.toLowerCase
    case other : String => other.toLowerCase == _value.toLowerCase
    case _ => false
  }
  override def toString = _value
}

object CaseInsensitiveString {
  implicit def CaseInsensitiveString2String(l : CaseInsensitiveString) : String = if ( l ==null ) null else l._value
  implicit def StringToCaseInsensitiveString(s : String) : CaseInsensitiveString = new CaseInsensitiveString(s)

  def apply( value : String ) = new CaseInsensitiveString(value)
  def unapply( l : CaseInsensitiveString) = Some(l._value)
}

谁能建议更清洁或更好的方法

我遇到的一个缺点就是使用junit的assertEquals,如下所示:

assertEquals("someString",instance.aCaseInsensitiveString)

它失败了,说它期望“someString”但得到CaseInsensitiveString<“someString”>.

如果我在assertEquals中反转变量的顺序,那么它可以工作,可能是因为它然后在类CaseInsensitiveString上调用equals函数.我目前通过保持顺序相同来解决这个问题(因此预期的实际上是预期的顺序)但是在CaseInsensitiveString上调用.toString:

assertEquals("someString",instance.aCaseInsensitiveString.toString)

这也有效:

assertEquals(CaseInsensitiveString("someString"),instance.aCaseInsensitiveString)

我可以在String中添加一个隐式等于解决这个问题吗?

解决方法

以下是使用“代理”和“有序”特征实现的更简洁的方法

// http://www.scala-lang.org/docu/files/api/scala/Proxy.html
// http://www.scala-lang.org/docu/files/api/scala/Ordered.html


case class CaseInsensitive(s: String) extends Proxy with Ordered[CaseInsensitive] {
  val self: String = s.toLowerCase
  def compare(other: CaseInsensitive) = self compareto other.self
  override def toString = s
  def i = this // convenience implicit conversion
}

没有帮助(“string”== CaseInsensitive(“String”))问题.

您可以隐式转换,如下所示:

implicit def sensitize(c: CaseInsensitive) = c.s
  implicit def desensitize(s: String) = CaseInsensitive(s)

哪个应该允许轻松比较:

assertEquals("Hello"i,"heLLo"i)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐