如何在案例类列表中查找字符串

时间:2018-12-12 04:11:26

标签: scala list

我有一个案例类Color

scala> case class Color(code: String, qty: String, shadecode: String, foo: Int)

我有一个案例类别列表

scala> val c = List[Color](Color("100", "10", "99"), Color("200", "20", "88"), Color("300", "10", "99"))

如何确定列表中是否存在此字符串:

scala> val colorString = "1001099"

字符串的约定将始终相同。前三个字符为code,后两个字符为qty,后两个字符为shadecode

我尝试了以下操作,但是由于我没有为foo传递任何值,因此它不起作用:

def doesExist(s: String, colors: Color): Boolean = {
  return colors.exists(_==Color(code= s.substring(0,3), qty = s.substring(3,4), shadecode = s.substring(5,6)))
}

4 个答案:

答案 0 :(得分:2)

在case类中添加一个函数,并使用该函数检查字符串是否匹配。这是简单的解决方案:

case class Color(code: String, qty: String, shadecode: String, foo: Int) {
  def matchString(colorString: String): Boolean = {
    val (code, qty, shadecode) = (
      colorString.substring(0,3),
      colorString.substring(3,5),
      colorString.substring(5,7))

    this.code == code && this.qty == qty && this.shadecode == shadecode
  }
}

然后:

 val exists = YOUR_COLOR_LIST.exists(_.matchString(YOUR_STRING))

答案 1 :(得分:2)

您应及早创建密钥,以便搜索更快

case class Color(code: String, qty: String, shadecode: String) {
  val k = s"$code$qty$shadecode"
}
val c = List[Color](Color("100", "10", "99"), Color("200", "20", "88"), Color("300", "10", "99"))
c.filter(_.k == "1001099") // Color(100,10,99)
c.exists(_.k == "1001099") // true    

答案 2 :(得分:1)

怎么样

def findColor(s: String, colors: Seq[Color]): Option[Color] = {
   val (code, qty, shadecode) = (
     s.substring(0,3), 
     s.substring(3,5), 
     s.substring(5,7))
   colors.find(c => c.code == code && c.qty == qty && c.shadecode == shadecode)
}

val exists = findColor("1001099", colors).isDefined

如果颜色列表很大且是静态的(意味着您多次在同一列表中搜索多次),则可能还需要构建一个索引(将其从O(n)转换为{{1 }} ---但前提是您可以大量重复使用索引。

O(1)

答案 3 :(得分:0)

您可以使用案例类的深度匹配功能来重新构造函数:

def doesExist(s: String, colors: List[Color]): Boolean = {
  val (code, qty, shadecode) = (s.substring(0,3), s.substring(3,5), s.substring(5,7))
  colors.exists{
    case Color(`code`, `qty`, `shadecode`, _) => true
    case _ => false
  }
}

而且,您为substringqty的{​​{1}}方法提供的参数不正确。