gpt4 book ai didi

java - 在 Scala 中覆盖 ArrayBuffer.contains() 方法

转载 作者:行者123 更新时间:2023-11-29 04:31:56 26 4
gpt4 key购买 nike

我是 Scala 新手,我想检查 String存在于ArrayBuffer[String] , 但不区分大小写。所以我在想创建一个新类 extends ArrayBuffer[String]并使用 Java String 方法 equalsIgnoreCase()例如:

MyArrayBuffer("smallint", "INt", "varchar").contains("int")

类是这样的:

class MyArrayBuffer[String]() extends ArrayBuffer[String] {
def containsCaseIns(str: String): Boolean = {
for (s <- this) {
if (str.equalsIgnoreCase(s))
true;
}
false;
}
}

但我因编译错误而失败了 "value equalsIgnoreCase is not a member of type parameter String"

那我该如何解决呢?或者有更好的方法吗?

最佳答案

这里没有必要使用子类。您可以使用现有方法轻松实现此功能

val buff = ArrayBuffer("smallint", "INt", "varchar")
buff.exists(_.equalsIgnoreCase("int")) //true

exists 接受一个条件,如果至少有一个元素满足该条件,则返回 true。

如果您认为将方法“containsIgnoreCase”添加到 ArrayBuffer[String] 更好,您也可以很容易地做到这一点,而无需使用扩展方法进行子类化,有时称为“增强我的库”模式。您可以通过将方法添加到隐式类来实现这一点。

object Extensions {
implicit class EnhancedStringBuffer(val underlying: ArrayBuffer[String]) extends AnyVal {
def containsIgnoreCase(elem: String): Boolean = underlying.exists(_.equalsIgnoreCase(elem))
}
}

现在可以了

 import Extensions._
ArrayBuffer("smallint", "INt", "varchar").containsIgnoreCase("int") //true

因为它是一种值类型,所以您不会产生任何额外的运行时对象分配成本。您甚至可以使其更通用,使用 GenTraversableOnce[String] 作为基础类型,然后您可以将这种新方法用于任何字符串集合。

请注意,这些方法的运行时间复杂度为 O(n)(存在一旦找到匹配项就会短路,因此并不总是需要完整遍历)。如果您正在收集大量字符串,并且需要经常进行包含检查,您可能需要完全采用不同的方法。在这种情况下,哈希集可能是您最好的选择,您只需在输入时将所有条目转换为大写。

import scala.collection.mutable

class CaseInsensitiveStrings {

private[this] val strings = new mutable.HashSet[String]()

def addString(elem: String) = strings.add(elem.toUpperCase)

def contains(elem: String) = strings.contains(elem.toUpperCase)

}

如果您只有相对较小的字符串集,或者您不经常执行此包含检查,那么这可能不值得这样做,但如果是这种情况,哈希集将允许对大型字符串集进行高效查找.这意味着您不能存储多个相同的不区分大小写的字符串,因此如果需要,您可以稍微更改一下。您可以添加您认为必要的任何其他方法或特征,但要小心确保所有条目均为大写的不变性成立。

关于java - 在 Scala 中覆盖 ArrayBuffer.contains() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43471650/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com