加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:40:07 所属栏目:安全 来源:网络整理
导读:我有很多类,其字段是不区分大小写的,我想将这些类的实例放入HashMaps中,并通过字符串不区分大小写来查找它们. 每次我想通过字符串索引实例,或者通过字符串查找实例时,我不是使用toLowerCase,而是尝试将此逻辑封装在CaseInsensitiveString类中: /** Used to
我有很多类,其字段是不区分大小写的,我想将这些类的实例放入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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读