Collections
Transform with a Loop
Build transformed text from a small list.
transform-loop
A loop can make each transformed value visible in replay. This is useful while learning the shape of a collection operation.
Transform with a Loop
TransformLoop.scala
Replay: real traced execution (multi-file project)
object Main {
def main(args: Array[String]): Unit = {
val factor = 2
val values = List(1, 2, 3)
var text = ""
for (value <- values) {
val scaled = value * factor
if (text == "") {
text = scaled.toString
} else {
text = text + "," + scaled.toString
}
}
println("factor=" + factor)
println("text=" + text)
}
}
object Main {
def main(args: Array[String]): Unit = {
val factor = 3
val values = List(1, 2, 3)
var text = ""
for (value <- values) {
val scaled = value * factor
if (text == "") {
text = scaled.toString
} else {
text = text + "," + scaled.toString
}
}
println("factor=" + factor)
println("text=" + text)
}
}
factor ← 2, values ← List(1, 2, 3), text ← (empty)
1object Main {2 def main(args: Array[String]): Unit = {3 val factor→ 2 = 2 //@factor=34 val values→ List(1, 2, 3) = List(1, 2, 3)5 var text→ (empty) = ""67 for (value <- values) {scaled ← 2
pass 1 of 37for (value1 <- valuesList(1, 2, 3)) {8 val scaled→ 2 = value1 * factor29 if (text == "") {10 text = scaled.toStringAll 3 passes — pass 1 is the card above pass valuescaled.toStringscaledtext1 1 2 2 (empty) → 2 2 2 4 4 2 → 2,4 3 3 6 6 2,4 → 2,4,6 text ← 2
8val scaled = value * factor9if (text(empty) == "") {10 text→ 2 = scaled.toString211} else {12 text = text + "," + scaled.toStringtext ← 2,4
pass 1 of 210 text = scaled.toString11 } else {12 text→ 2,4 = text + "," + scaled.toString413 }14}text ← 2,4,6
pass 2 of 210 text = scaled.toString11 } else {12 text→ 2,4,6 = text + "," + scaled.toString613 }14}println("factor=" + factor)
16 println("factor=" + factor2)17 println("text=" + text2,4,6)18 }19}outputfactor=2 text=2,4,6
factor ← 3, values ← List(1, 2, 3), text ← (empty)
1object Main {2 def main(args: Array[String]): Unit = {3 val factor→ 3 = 34 val values→ List(1, 2, 3) = List(1, 2, 3)5 var text→ (empty) = ""67 for (value <- values) {scaled ← 3
pass 1 of 37for (value1 <- valuesList(1, 2, 3)) {8 val scaled→ 3 = value1 * factor39 if (text == "") {10 text = scaled.toStringAll 3 passes — pass 1 is the card above pass valuescaled.toStringscaledtext1 1 3 3 (empty) → 3 2 2 6 6 3 → 3,6 3 3 9 9 3,6 → 3,6,9 text ← 3
8val scaled = value * factor9if (text(empty) == "") {10 text→ 3 = scaled.toString311} else {12 text = text + "," + scaled.toStringtext ← 3,6
pass 1 of 210 text = scaled.toString11 } else {12 text→ 3,6 = text + "," + scaled.toString613 }14}text ← 3,6,9
pass 2 of 210 text = scaled.toString11 } else {12 text→ 3,6,9 = text + "," + scaled.toString913 }14}println("factor=" + factor)
16 println("factor=" + factor3)17 println("text=" + text3,6,9)18 }19}outputfactor=3 text=3,6,9
Scale Each Value
valuesstarts asList(1, 2, 3).factoris2.- Each loop pass multiplies one value.
- The text grows into
2,4,6. | Value | Scaled value | Text after step | | --- | --- | --- | |1|2|2| |2|4|2,4| |3|6|2,4,6|
Exercise: TransformLoop.scala
Loop through values, multiply each by a factor, and build comma-separated text