我有很多类,其字段是不区分大小写的,我想将这些类的实例放入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)
}
Run Code Online (Sandbox Code Playgroud)
谁能建议更清洁或更好的方法?
我遇到的一个缺点就是使用junit的assertEquals,如下所示:
assertEquals("someString", instance.aCaseInsensitiveString)
Run Code Online (Sandbox Code Playgroud)
它失败了,说它期望"someString"但得到CaseInsensitiveString <"someString">.
如果我在assertEquals中反转变量的顺序,那么它可以工作,可能是因为它然后在类CaseInsensitiveString上调用equals函数.我目前通过保持顺序相同来解决这个问题(因此预期的实际上是预期的顺序)但是在CaseInsensitiveString上调用.toString:
assertEquals("someString", instance.aCaseInsensitiveString.toString)
Run Code Online (Sandbox Code Playgroud)
这也有效:
assertEquals(CaseInsensitiveString("someString"), instance.aCaseInsensitiveString)
Run Code Online (Sandbox Code Playgroud)
我可以在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
}
Run Code Online (Sandbox Code Playgroud)
没有帮助("string"== CaseInsensitive("String"))问题.
您可以隐式转换,如下所示:
implicit def sensitize(c: CaseInsensitive) = c.s
implicit def desensitize(s: String) = CaseInsensitive(s)
Run Code Online (Sandbox Code Playgroud)
哪个应该允许轻松比较:
assertEquals("Hello"i, "heLLo"i)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3737 次 |
| 最近记录: |