0

我现在正在学习 Scala,我有一个场景,我必须将一个元素(比如num)与列表中的所有元素进行比较。

认为,

val MyList = List(1, 2, 3, 4)

如果num列表中的元素等于任何人,我需要返回true. 我知道使用headandtail函数递归地执行它,但是有没有更简单的方法(我想我可以使用 来执行它foreach,但我不确定如何准确地实现它)?

4

4 回答 4

10

有多种可能性:

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)
于 2012-10-08T11:15:12.803 回答
3

对于contains任何语言的列表,方法都是相当标准的。ScalaList也有:

http://www.scala-lang.org/api/current/scala/collection/immutable/List.html

于 2012-10-08T11:13:26.037 回答
3

正如其他人所回答的那样,contains列表中的方法正是这样做的,这是最容易理解/最有效的方法。

但是,看看您的结束评论,您将无法(以优雅的方式)使用foreach,因为它会返回Unit。Foreach 为每个元素“做”一些事情,但你没有得到任何结果。它对记录/println 语句很有用,但它不充当转换。

如果要单独对每个元素运行函数,可以使用map,它返回应用函数结果的列表。所以假设 num = 3,那么MyList.map(_ == num)将返回List(false, false, true, false). 由于您正在寻找单个结果,而不是结果列表,因此这不是您所追求的。

为了将一系列事物折叠成一个结果,您将使用折叠数据。折叠涉及一个函数,该函数接受两个参数(目前的结果和列表中的当前事物)并返回新的运行结果。因此,这可以在第一个元素上起作用,您还需要提供初始值以用于正在进行的结果(通常是某种零)。

那么,在您的特定情况下,您Boolean最终需要一个答案-“找到的元素等于num”。所以运行结果将是“到目前为止我是否看到了一个等于num”的元素。这意味着初始值为falsetrue如果已经看到一个元素,或者如果当前元素等于 ,则函数本身应该返回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。但作为一个指导性示例,您可以通过列表上的原始函数操作自己实现这一点。

于 2012-10-08T11:39:42.820 回答
2

List有一个方法:

val found = MyList.contains(num)
于 2012-10-08T11:13:19.480 回答