我有很多类,其字段是不区分大小写的,我想将这些类的实例放入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)
解决方法
以下是使用“代理”和“有序”特征实现的更简洁的方法:
// 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 举报,一经查实,本站将立刻删除。