|     35 // Collections |     35 // Collections | 
|     36 //============= |     36 //============= | 
|     37 List(1,2,3,1) |     37 List(1,2,3,1) | 
|     38 Set(1,2,3,1) |     38 Set(1,2,3,1) | 
|     39  |     39  | 
|         |     40 // ranges | 
|     40 1 to 10 |     41 1 to 10 | 
|     41 (1 to 10).toList |     42 (1 to 10).toList | 
|     42  |     43  | 
|     43 (1 until 10).toList |     44 (1 until 10).toList | 
|     44  |     45  | 
|     45 // an element in a list |     46 // picking an element in a list | 
|     46 val lst = List(1, 2, 3, 1) |     47 val lst = List(1, 2, 3, 1) | 
|     47 lst(0) |     48 lst(0) | 
|     48 lst(2) |     49 lst(2) | 
|     49  |     50  | 
|     50 // some alterative syntax for lists |     51 // some alterative syntax for lists | 
|     51  |     52  | 
|     52 1 :: 2 :: 3 :: Nil |     53 1 :: 2 :: 3 :: Nil | 
|     53 List(1, 2, 3) ::: List(4, 5, 6) |     54 List(1, 2, 3) ::: List(4, 5, 6) | 
|     54  |     55  | 
|     55 // Equality is structural |     56 // Equality in Scala is structural | 
|     56 //======================== |     57 //================================= | 
|     57 val a = "Dave" |     58 val a = "Dave" | 
|     58 val b = "Dave" |     59 val b = "Dave" | 
|     59  |     60  | 
|     60 if (a == b) println("Equal") else println("Unequal") |     61 if (a == b) println("Equal") else println("Unequal") | 
|     61  |     62  | 
|     74 // Printing/Strings |     75 // Printing/Strings | 
|     75 //================== |     76 //================== | 
|     76  |     77  | 
|     77 println("test") |     78 println("test") | 
|     78  |     79  | 
|     79 val tst = "This is a " + "test\n"  |     80 val tst = "This is a " ++ "test"  | 
|         |     81 print(tst) | 
|     80 println(tst) |     82 println(tst) | 
|     81  |     83  | 
|     82 val lst = List(1,2,3,1) |     84 val lst = List(1,2,3,1) | 
|     83  |     85  | 
|     84  |     86  | 
|     85 println(lst.toString) |     87 println(lst.toString) | 
|         |     88  | 
|         |     89 println(lst.mkString) | 
|     86 println(lst.mkString(",")) |     90 println(lst.mkString(",")) | 
|     87  |     91  | 
|     88 println(lst.mkString(", ")) |     92 println(lst.mkString(", ")) | 
|     89  |     93  | 
|     90 // some methods take more than one argument |     94 // some methods take more than one argument | 
|     91 println(lst.mkString("{", ",", "}")) |     95 println(lst.mkString("{", ",", "}")) | 
|     92  |     96  | 
|         |     97 // (in this case .mkString can take no, one,  | 
|         |     98 // or three arguments...this has to do with | 
|         |     99 // default arguments) | 
|     93  |    100  | 
|     94  |    101  | 
|     95 // Conversion methods |    102 // Conversion methods | 
|     96 //==================== |    103 //==================== | 
|     97  |    104  | 
|     98 List(1,2,3,1).toString |    105 List(1,2,3,1).toString | 
|     99 List(1,2,3,1).toSet |    106 List(1,2,3,1).toSet | 
|         |    107  | 
|    100 "hello".toList.tail |    108 "hello".toList.tail | 
|    101 1.toDouble |    109 1.toDouble | 
|    102  |    110  | 
|    103  |    111  | 
|    104 // useful list methods |    112 // useful list methods | 
|    117 "1,2,3,4,5".split(",3,").mkString("\n") |    125 "1,2,3,4,5".split(",3,").mkString("\n") | 
|    118  |    126  | 
|    119 "abcdefg".startsWith("abc") |    127 "abcdefg".startsWith("abc") | 
|    120  |    128  | 
|    121  |    129  | 
|    122 // Types (slide) |    130 // Types (see slide) | 
|    123 //=============== |    131 //=================== | 
|    124  |    132  | 
|    125 /* Scala is a strongly typed language |    133 /* Scala is a strongly typed language | 
|    126   |    134   | 
|    127  * some base types |    135  * base types | 
|    128  |    136  | 
|    129     Int, Long, BigInt, Float, Double |    137     Int, Long, BigInt, Float, Double | 
|    130     String, Char |    138     String, Char | 
|    131     Boolean |    139     Boolean... | 
|    132  |    140  | 
|    133  * some compound types  |    141  * compound types  | 
|    134  |    142  | 
|    135     List[Int], |    143     List[Int] | 
|    136     Set[Double] |    144     Set[Double] | 
|    137     Pairs: (Int, String)         |    145     Pairs: (Int, String)         | 
|    138     List[(BigInt, String)] |    146     List[(BigInt, String)] | 
|    139     Option[Int] |    147     Option[Int] | 
|         |    148  | 
|         |    149  * user-defined types (later) | 
|         |    150  | 
|    140 */ |    151 */ | 
|    141  |    152  | 
|    142  |    153  | 
|         |    154 // you can make the type of a value explicit | 
|    143 val name: String = "leo" |    155 val name: String = "leo" | 
|    144  |    156  | 
|    145  |    157  | 
|    146 // type errors |    158 // type errors | 
|    147 math.sqrt("64") |    159 math.sqrt("64") | 
|    172 def incr(x: Int) : Int = x + 1 |    185 def incr(x: Int) : Int = x + 1 | 
|    173 def double(x: Int) : Int = x + x |    186 def double(x: Int) : Int = x + x | 
|    174 def square(x: Int) : Int = x * x |    187 def square(x: Int) : Int = x * x | 
|    175  |    188  | 
|    176 def str(x: Int) : String = x.toString |    189 def str(x: Int) : String = x.toString | 
|         |    190  | 
|         |    191 incr(3) | 
|         |    192 double(4) | 
|    177 square(6) |    193 square(6) | 
|         |    194 str(3) | 
|    178  |    195  | 
|    179  |    196  | 
|    180 // The general scheme for a function: you have to give a type  |    197 // The general scheme for a function: you have to give a type  | 
|    181 // to each argument and a return type of the function |    198 // to each argument and a return type of the function | 
|    182 // |    199 // | 
|    193 def silly(n: Int) : Int = { |    210 def silly(n: Int) : Int = { | 
|    194   if (n < 10) n * n |    211   if (n < 10) n * n | 
|    195   else n + n |    212   else n + n | 
|    196 } |    213 } | 
|    197  |    214  | 
|         |    215 def another_silly(x: Int, y: String) : String = { | 
|         |    216   if (x <= 12) y | 
|         |    217   else x.toString | 
|         |    218 } | 
|         |    219  | 
|         |    220 another_silly(2, "two") | 
|         |    221 another_silly(12, "twelf") | 
|         |    222 another_silly(20, "twenty") | 
|         |    223  | 
|    198  |    224  | 
|    199 // If-Conditionals |    225 // If-Conditionals | 
|    200 //================= |    226 //================= | 
|    201  |    227  | 
|    202 // - Scala does not have a then-keyword |    228 // - Scala does not have a then-keyword | 
|    203 // - both if-else branches need to be present |    229 // - !both if-else branches need to be present! | 
|    204  |    230  | 
|    205 def fact(n: Int) : Int =  |    231 def fact(n: Int) : Int =  | 
|    206   if (n == 0) 1 else n * fact(n - 1) |    232   if (n == 0) 1 else n * fact(n - 1) | 
|    207  |    233  | 
|    208  |    234  | 
|    248  |    274  | 
|    249  |    275  | 
|    250 // Option type |    276 // Option type | 
|    251 //============= |    277 //============= | 
|    252  |    278  | 
|    253 //in Java if something unusually happens, you return null |    279 //in Java if something unusually happens, you return null or something | 
|    254 // |    280 // | 
|    255 //in Scala you use Options instead |    281 //in Scala you use Options instead | 
|    256 //   - if the value is present, you use Some(value) |    282 //   - if the value is present, you use Some(value) | 
|    257 //   - if no value is present, you use None |    283 //   - if no value is present, you use None | 
|    258  |    284  | 
|    297 // much better - you record in the type that things can go wrong  |    323 // much better - you record in the type that things can go wrong  | 
|    298 def get_contents(name: String) : Option[List[String]] =  |    324 def get_contents(name: String) : Option[List[String]] =  | 
|    299   Try(Some(Source.fromFile(name).getLines.toList)).getOrElse(None) |    325   Try(Some(Source.fromFile(name).getLines.toList)).getOrElse(None) | 
|    300  |    326  | 
|    301 get_contents("text.txt") |    327 get_contents("text.txt") | 
|    302  |    328 get_contents("test.txt") | 
|    303  |    329  | 
|    304  |    330  | 
|    305 // String Interpolations |    331 // String Interpolations | 
|    306 //======================= |    332 //======================= | 
|    307  |    333  | 
|    344  |    370  | 
|    345 for (n <- (1 to 10).toList;  |    371 for (n <- (1 to 10).toList;  | 
|    346      m <- (1 to 10).toList) yield m * n |    372      m <- (1 to 10).toList) yield m * n | 
|    347  |    373  | 
|    348  |    374  | 
|         |    375 // you can assign the result of a for-comprehension | 
|         |    376 // to a value | 
|    349 val mult_table =  |    377 val mult_table =  | 
|    350   for (n <- (1 to 10).toList;  |    378   for (n <- (1 to 10).toList;  | 
|    351        m <- (1 to 10).toList) yield m * n |    379        m <- (1 to 10).toList) yield m * n | 
|    352  |    380  | 
|    353 println(mult_table.mkString) |    381 println(mult_table.mkString) | 
|    424  |    452  | 
|    425 // Why not just? Why making your life so complicated? |    453 // Why not just? Why making your life so complicated? | 
|    426 for (c <- lst) println(c) |    454 for (c <- lst) println(c) | 
|    427  |    455  | 
|    428 // Aside: concurrency  |    456 // Aside: concurrency  | 
|    429 // (ONLY WORKS OUT-OF-THE-BOX IN SCALA 2.11.8, not in SCALA 2.12) |    457 // (scala <<..parallel_collections...>> -Yrepl-class-based) | 
|    430 // (would need to have this wrapped into a function, or |         | 
|    431 //  REPL called with scala -Yrepl-class-based) |         | 
|    432 for (n <- (1 to 10)) println(n) |    458 for (n <- (1 to 10)) println(n) | 
|         |    459  | 
|         |    460 import scala.collection.parallel.CollectionConverters._ | 
|         |    461  | 
|    433 for (n <- (1 to 10).par) println(n) |    462 for (n <- (1 to 10).par) println(n) | 
|    434  |    463  | 
|    435  |    464  | 
|    436 // for measuring time |    465 // for measuring time | 
|    437 def time_needed[T](n: Int, code: => T) = { |    466 def time_needed[T](n: Int, code: => T) = { | 
|    454 // - no vars, no ++i, no += |    483 // - no vars, no ++i, no += | 
|    455 // - no mutable data-structures (no Arrays, no ListBuffers) |    484 // - no mutable data-structures (no Arrays, no ListBuffers) | 
|    456  |    485  | 
|    457  |    486  | 
|    458 // Q: Count how many elements are in the intersections of two sets? |    487 // Q: Count how many elements are in the intersections of two sets? | 
|         |    488 // A; IMPROPER WAY (mutable counter) | 
|    459  |    489  | 
|    460 def count_intersection(A: Set[Int], B: Set[Int]) : Int = { |    490 def count_intersection(A: Set[Int], B: Set[Int]) : Int = { | 
|    461   var count = 0 |    491   var count = 0 | 
|    462   for (x <- A; if (B contains x)) count += 1  |    492   for (x <- A; if (B contains x)) count += 1  | 
|    463   count |    493   count |