Scala中 zip或者zipWithIndex的用法


問題:
你要遍歷一個有序集合,同時你又想訪問一個循環計數器,但最重要的是你真的不需要手動創建這個計數器。
解決方案:
    使用zipWithIndex或者zip方法來自動地創建一個計數器,假設你有一個有序集合days,那么你可以使用zipWithIndex和counter來打印帶有計數器的集合元素:

scala> val days = Array("Sunday""Monday""Tuesday""Wednesday","Thursday""Friday""Saturday") days: Array[String] = Array(Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday) scala> days.zipWithIndex.foreach{case(day,count) => println(s"$count is $day")} 0 is Sunday 1 is Monday 2 is Tuesday 3 is Wednesday 4 is Thursday 5 is Friday 6 is Saturday

同樣,你可以使用for循環來打印計數器和集合元素

scala> for((day,count) <- days.zipWithIndex) {      |   println(s"$count is $day")      | } 0 is Sunday 1 is Monday 2 is Tuesday 3 is Wednesday 4 is Thursday 5 is Friday 6 is Saturday

zipWithIndex的計數器都是從0開始,如果你想指定開始的值,那么你可以使用zip Stream:

scala> for((day,count) <- days.zip(Stream from 1)) {      |   println(s"$count is $day")      | } 1 is Sunday 2 is Monday 3 is Tuesday 4 is Wednesday 5 is Thursday 6 is Friday 7 is Saturday

Discussion

    當有序集合調用zipWithIndex的時候,它會返回一個有序的二元組集合:

scala> val list = List("a""b""c") list: List[String] = List(a, b, c) scala> list.zipWithIndex res3: List[(String, Int)] = List((a,0), (b,1), (c,2))

因為zipWithIndex是在一個已經存在的有序集合的基礎上建立一個新的有序集合,你可以在調用zipWithIndex之前調用view:

  1. scala> val zwv = list.view.zipWithIndex
  2. zwv: scala.collection.SeqView[(String, Int),Seq[_]] = SeqViewZ(...)

就像上面這個例子里面看到的,它在原有的List基礎上創建了一個lazy view,所以這個元組集合並不被會被創建,直到它被調用的那一刻。正因有這種特性,我們推薦在調用zipWithIndex之前先調用view方法。

   zip和zipWithIndex方法都返回一個有序二元組集合。因此,你的foreach方法也可以寫成下面這樣,雖然這比起解決方案中的方法,可讀性略差。

scala> days.zipWithIndex.foreach(d => println(s"${d._2} is ${d._1}")) 0 is Sunday 1 is Monday 2 is Tuesday 3 is Wednesday 4 is Thursday 5 is Friday 6 is Saturday

 在之前的例子中我們曾經見過,可以通過一個for循環加range來創建這個計數器:

scala> val fruits = Array("apple""banana""orange") fruits: Array[String] = Array(apple, banana, orange) scalafor (i <- 0 until fruits.size) println(s"element $i is ${fruits(i)}") element 0 is apple element 1 is banana element 2 is orange

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM