我有一个案例类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)))
}
答案 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
}
}
而且,您为substring
和qty
的{{1}}方法提供的参数不正确。