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

标签 java scala

我是 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/

相关文章:

scala - toArray 的值不是 org.apache.spark.rdd.RDD[(String, Int)] 的成员

list - 如何在 Scala 中保持表达式的函数式风格

java - 如何打印给定范围内以1结尾的素数以及b之后最接近的素数?

java - 使用准备好的语句进行更新 : ORA-00933 error

java - JDialog - 如何使回车键响应按钮焦点在对话框上

java - 如何通过消除所有空/空条目来折叠二维数组

reflection - 案例类上的 `productElement(i)`是否使用反射?

scala - 为什么不可能覆盖已经实现的抽象类型?

java - 写入 volatile 变量后会发生什么?

java - 最佳 Ivy 实践 : Split code into multiple projects or use one project with multiple configurations?