繁体   English   中英

Scala:用于匹配List中的int的循环

[英]Scala: For loop that matches ints in a List

Scala新手。 我正在迭代一次for循环100次。 10次​​我想要满足条件'a'和90次条件'b'。 但是我希望10 a随机出现。

我能想到的最好的方法是创建一个10个随机整数的val,然后循环1到100个整数。

例如:

val z = List.fill(10)(100).map(scala.util.Random.nextInt)

z: List[Int] = List(71, 5, 2, 9, 26, 96, 69, 26, 92, 4)

然后像:

for (i <- 1 to 100) {
  whenever i == to a number in z: 'Condition a met: do something'
else {
   'condition b met: do something else'
  }
}

我尝试使用contains===! 但似乎没什么用。 我怎么能这样做?

你生成的随机数可能会产生重复......是吗? 以下是如何轻松生成10个唯一数字1-100(通过生成随机洗牌的1-100并取前10个):

val r = scala.util.Random.shuffle(1 to 100).toList.take(10)

现在,您可以简单地将范围1-100分区为随机生成的列表中包含的范围和不包含的范围:

val (listOfA, listOfB) = (1 to 100).partition(r.contains(_))

现在用这两个列表做任何你想做的事,例如:

println(listOfA.mkString(","))
println(listOfB.mkString(","))

当然,您可以随时简单地浏览列表:

(1 to 100).map {
  case i if (r.contains(i)) => println("yes: " + i) // or whatever
  case i => println("no: " + i)
}

您认为简单的for循环实际上不是一个。 这是一种理解,它是一种语法糖,可以解释为地图,flatMaps和过滤器的链式调用。 是的,它可以像使用经典的for循环一样使用,但这只是因为List实际上是一个monad。 如果你想用惯用的Scala方式(“功能”方式)做一些事情,你应该避免尝试编写经典的迭代for循环,而是选择获取数据的集合,然后将其元素映射到执行你需要的任何东西。 请注意,集合后面有一个非常丰富的库,允许您调用partition等很酷的方法。

编辑(完整性):

此外,你应该避免副作用,或者至少将它们推到尽可能远的路上。 我正在谈论我的回答中的第二个例子。 假设您确实需要记录这些内容(您将使用记录器,但println对于此示例已经足够了)。 这样做很糟糕。 顺便提一下,在这种情况下你可以使用foreach而不是map ,因为你没有收集结果,只是执行副作用。

好的方法是通过将每个元素修改为适当的字符串来计算所需的东西。 因此,计算所需的字符串并将其累积到results

val results = (1 to 100).map {
  case i if (r.contains(i)) => ("yes: " + i) // or whatever
  case i => ("no: " + i)
}

// do whatever with results, e.g. print them

现在results包含一百个“是x”和“无x”字符串的列表,但是您没有做出丑陋的事情并且在映射过程中执行日志作为副作用。 相反,您将集合的每个元素映射到相应的字符串(请注意,原始集合保持不变,因此如果(1到100)存储在某个值中,它仍然存在;映射会创建一个新集合)现在您可以执行任何操作你想要它,例如传递给记录器。 是的,在某些时候你需要做“丑陋的副作用”并记录这些东西,但至少你会有一个特殊的代码部分来做这件事而你不会把它混合到你的映射逻辑中来检查是否有数字包含在随机序列中。

(1 to 100).foreach { x =>
  if(z.contains(x)) {
    // do something
  } else {
    // do something else
  }
}

或者您可以使用部分功能,如下所示:

(1 to 100).foreach {
  case x if(z.contains(x)) => // do something
  case _ => // do something else
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM