用于检查scala中数组中元素的函数

时间:2018-03-20 00:25:31

标签: scala function

def f(c: String) = {
  val array = ("google.com|yahoo.com|gmail.com|mail.com").split("\\|")
  for (i <- array) {
    if (c.contains(i)) {
      println("comparing " + c + " with " + i)
      i
    }
  }
  "N/A"
}

我对上述函数的意图是,如果N/A不包含数组的任何元素,它将返回c。并且,如果是,它将返回数组中的元素。因此,如果c="www.google.com/1234",理想情况下函数将返回google.com,如果c="bloomberg.com/example",则函数将返回N/A

但当我println(f("www.google.com/1234"))时,我得到N/A。 谁能告诉我我做错了什么。

2 个答案:

答案 0 :(得分:2)

您的函数始终返回N/A,因为它是其定义中的最后一个值。最后留下一个值就像在Scala中一样,就像写return "N/A"一样。但即使最后没有N/A,你的功能也不会返回你想要的东西,因为:

  1. 最后一个语句是for { ... },类型为Unit
  2. 您的功能是副作用,通过致电println,它与返回值不一样
  3. 让我们先写一个试图找到匹配的函数:

    def findMatch(c: String): Option[String] = {
      val array = "google.com|yahoo.com|gmail.com|mail.com".split('|')
      array.find(c.contains)
    }
    

    请注意,返回类型为Option[String],来自对find method的调用。现在,您可以使用它来打印结果(如果它在那里)或N/A否则:

    def f(c: String): Unit = {
      println(findMatch(c).getOrElse("N/A"))
    }
    

答案 1 :(得分:0)

虽然laughedelics解决方案看起来很好,但另一个解决方案也是可行的:

def f (c: String) : List[String] = {
  val array = ("google.com|yahoo.com|gmail.com|mail.com").split("\\|")
  val list = (for (i <- array 
    if (c.contains(i))) yield {
      println("comparing " + c + " with " + i)
      i
    }).toList
  if (list.isEmpty) List ("N/A") else list
}

它在迭代时打印并返回一个匹配列表,或者返回一个字符串为“N / A”的List,实际上,在大多数情况下,这应该会产生恰好一个String的List,而不是更少或更多,但根据输入,可能有多个匹配。

scala> f ("www.google.com/1234")
comparing www.google.com/1234 with google.com
res61: List[String] = List(google.com)

scala> f ("www.göögle.com/1234")
res62: List[String] = List(N/A)

scala> f ("www.google.com/1234?param:subject='mail.com'")
comparing www.google.com/1234?param:subject='mail.com' with google.com
comparing www.google.com/1234?param:subject='mail.com' with mail.com
res63: List[String] = List(google.com, mail.com)

您的方法的主要区别在于使用yield,从for-construct返回一些东西。