Как проверить, существует элемент или нет в списке [Any], используя Scala - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть список, подобный следующему:

val map_temp =
  List(
    (List("SRC_123","SRC_999"),"TRGT_123"),
    (List("SRC_456"),"TRGT_456"),
    (List("SRC_789"),"TRGT_789"),
    (List("SRC_888"),"TRGT_888"),
  )

Я хочу проверить, существует ли в нем SRC_999.

Я попробовал следующее:

map_temp.foreach {
  case(key, value) =>
    if (key.contains("SRC_999")) {
      print("yes exists")
    }
}

Это вызывает следующую ошибку

error: value contains is not a member of Any
case(key:Any, value) => if(key.contains("SRC_99"))

Я также пробовал это:

map_temp.foreach(a => if(a._1.contains("SRC_999")))

Но это вызывает следующую ошибку:

error: value contains is not a member of Any
mapped.foreach(a => print(a._1.contains("SRC_999")))

Как я могу решить это?

Ответы [ 3 ]

0 голосов
/ 07 апреля 2020

Это должно делать то, что вы хотите:

val map_temp =
  List(
    (List("SRC_123","SRC_999"),"TRGT_123"),
    (List("SRC_456"),"TRGT_456"),
    (List("SRC_789"),"TRGT_789"),
    (List("SRC_888"),"TRGT_888"),
  )

def exists[A](input: List[(List[A], _)], what: A): Boolean =
  input.exists(_._1.contains(what))

// should be found
assert(exists(map_temp, "SRC_999"))
assert(exists(map_temp, "SRC_888"))

// should not be found
assert(!exists(map_temp, "SRC_998"))
assert(!exists(map_temp, "TRGT_123"))

Я не думаю, что у вас на самом деле есть List[Any] для начала. Похоже, что вы испытываете пару ошибок типа, которые могут ввести вас в заблуждение. Ваш map_temp является List[(List[String], String)].

Если это не так, и вы получаете map_temp от метода, который по какой-то причине возвращает List[Any], если вы контролируете этот метод Вы можете изменить его, чтобы отразить фактический тип. Если вы не можете, даже если это небезопасно, вы можете попытаться разыграть его.

С небольшими изменениями вы также можете получить предметы:

def find[A, B](input: List[(List[A], B)], what: A): Option[B] =
  input.find(_._1.contains(what)).map(_._2)

// should be found
assert(find(map_temp, "SRC_999") == Some("TRGT_123"))
assert(find(map_temp, "SRC_888") == Some("TRGT_888"))

// should not be found
assert(find(map_temp, "SRC_998") == None)
assert(find(map_temp, "TRGT_123") == None)

Вы можете поиграть с этим код здесь на Scast ie.

0 голосов
/ 07 апреля 2020

Значение map_temp равно List[(List[String], String)], а не List[Any]. Вы можете проверить элемент, который вы ищете следующим образом:

map_temp.exists(_._1.contains("SRC_999"))
0 голосов
/ 07 апреля 2020

Как я могу решить эту проблему?

Не имея List[Any].

Имея List[Any], вы явно указываете Scala, что элементы могут быть чем угодно . Это означает, что Scala ничего не знает об элементах. Он даже не знает, есть ли у них метод contains или нет. Например, элементы могут быть целыми числами, у которых нет метода contains.

...