实现在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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |