簡體   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