如何使用Scala检查列表中是否存在元素[Any]

问题描述 投票:-1回答:3

我有一个类似以下的列表:

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")))

我该如何解决?

list scala contains check
3个回答
0
投票

我该如何解决?

没有List[Any]

通过具有List[Any],您明确地告诉Scala元素可能是anything。这意味着Scala对元素一无所知。它甚至不知道他们是否具有contains方法。元素可以是整数,例如,没有contains方法。


0
投票

map_temp的值为List[(List[String], String)],而不是List[Any]。您可以像这样检查要查找的元素:

map_temp.exists(_._1.contains("SRC_999"))

0
投票

这应该做您想要的:

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_tempList[(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)

您可以使用此代码here on Scastie来玩耍。

© www.soinside.com 2019 - 2024. All rights reserved.