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



我有一个如下列表:

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[Any]

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

map_temp的值是List[(List[String], String)],而不是List[Any]。你可以这样检查你正在寻找的元素:

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

这应该可以实现您想要的:

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

如果不是这样,并且您从一个由于某种原因返回List[Any]的方法中获得map_temp,那么如果您控制该方法,则可以更改它以反映实际类型。如果你不能,即使它不安全,你也可以尝试铸造它。

只需少量更改,您还可以检索项目:

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)

你可以在Scastie上玩这个代码。

最新更新