我现在正在学习 Scala,我有一个场景,我必须将一个元素(比如num
)与列表中的所有元素进行比较。
认为,
val MyList = List(1, 2, 3, 4)
如果num
列表中的元素等于任何人,我需要返回true
. 我知道使用head
andtail
函数递归地执行它,但是有没有更简单的方法(我想我可以使用 来执行它foreach
,但我不确定如何准确地实现它)?
我现在正在学习 Scala,我有一个场景,我必须将一个元素(比如num
)与列表中的所有元素进行比较。
认为,
val MyList = List(1, 2, 3, 4)
如果num
列表中的元素等于任何人,我需要返回true
. 我知道使用head
andtail
函数递归地执行它,但是有没有更简单的方法(我想我可以使用 来执行它foreach
,但我不确定如何准确地实现它)?
有多种可能性:
val x = 3
MyList.contains(x)
!MyList.forall(y => y != x) // early exit, basically the same as .contains
如果您打算经常这样做,您可以考虑将列表转换为 Set,因为.contains
在最坏的情况下,列表上的每次查找都与元素数量成正比,而在 Set 上它实际上是恒定的
val mySet = MyList.toSet
mySet.contains(x)
或者简单地说:
mySet(x)
对于contains
任何语言的列表,方法都是相当标准的。ScalaList
也有:
http://www.scala-lang.org/api/current/scala/collection/immutable/List.html
正如其他人所回答的那样,contains
列表中的方法正是这样做的,这是最容易理解/最有效的方法。
但是,看看您的结束评论,您将无法(以优雅的方式)使用foreach
,因为它会返回Unit
。Foreach 为每个元素“做”一些事情,但你没有得到任何结果。它对记录/println 语句很有用,但它不充当转换。
如果要单独对每个元素运行函数,可以使用map
,它返回应用函数结果的列表。所以假设 num = 3,那么MyList.map(_ == num)
将返回List(false, false, true, false)
. 由于您正在寻找单个结果,而不是结果列表,因此这不是您所追求的。
为了将一系列事物折叠成一个结果,您将使用折叠数据。折叠涉及一个函数,该函数接受两个参数(目前的结果和列表中的当前事物)并返回新的运行结果。因此,这可以在第一个元素上起作用,您还需要提供初始值以用于正在进行的结果(通常是某种零)。
那么,在您的特定情况下,您Boolean
最终需要一个答案-“找到的元素等于num
”。所以运行结果将是“到目前为止我是否看到了一个等于num
”的元素。这意味着初始值为false
。true
如果已经看到一个元素,或者如果当前元素等于 ,则函数本身应该返回num
。
放在一起,它看起来像这样:
MyList.foldLeft(false) { case (runningResult, listElem) =>
// return true if runningResult is true, or if listElem is the target number
runningResult || listElem == num
}
这并没有在找到目标值后立即停止的好处——而且它远没有 call 简洁MyList.contains
。但作为一个指导性示例,您可以通过列表上的原始函数操作自己实现这一点。
List
有一个方法:
val found = MyList.contains(num)