我有一个如下列表:
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_temp
是List[(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上玩这个代码。