Как найти строку в списке дел - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть класс дела 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 голосов
/ 12 декабря 2018

Вы должны создать ключ рано, чтобы поиск был быстрее

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    
0 голосов
/ 12 декабря 2018

Как насчет

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) до O(1) --- но только если вы можете многократно использовать индекс).

val indexedColors: Map[String, Color] = colors.map(c => (c.toCodeString, c)).toMap
val exists = indexColors.containsKey("1001099")
0 голосов
/ 12 декабря 2018

Добавьте функцию в ваш класс 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))
0 голосов
/ 12 декабря 2018

Вы можете перефразировать свою функцию, используя функции глубокого сопоставления классов дел:

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 и shadecode, были неверными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...