Scala lists maps sets tuples arrays and Ranges
Array
println("hello array , scala")
var z:Array[String] = new Array(3)
println(z) //[Ljava.lang.String;@fa36558
var myList = Array(1.9, 2.9, 3.4, 3.5)
// Print all the array elements
for ( x <- myList ) {
println( x )
}
// Summing all elements
var total = 0.0;
for ( i <- 0 to (myList.length - 1)) {
total += myList(i);
}
println("Total is " + total);
// Finding the largest element
var max = myList(0);
for ( i <- 1 to (myList.length - 1) ) {
if (myList(i) > max) max = myList(i);
}
println("Max is " + max);
/////////////////////////////////////////
// 多维数组
/////////////////////////////////////////
import Array._
// Multi-Dimensional Arrays:
// 多维数组
var myMatrix = ofDim[Int](3,3)
// build a matrix
for (i <- 0 to 2) {
for ( j <- 0 to 2) {
myMatrix(i)(j) = j;
}
}
// Print two dimensional array
for (i <- 0 to 2) {
for ( j <- 0 to 2) {
print(" " + myMatrix(i)(j));
}
println();
}
/////////////////////////////////////////
// 多维数组
/////////////////////////////////////////
// scala 连接两个数组
var myList1 = Array(1.9, 2.9, 3.4, 3.5)
var myList2 = Array(8.9, 7.9, 0.4, 1.5)
var myList3 = concat( myList1, myList2)
// Print all the array elements
for ( x <- myList3 ) {
println( x )
}
var my1 = range(10, 20, 2)
var my2 = range(10,20)
// Print all the array elements
for ( x <- my1 ) {
print( " " + x ) // 10 12 14 16 18
}
println()
for ( x <- my2 ) {
print( " " + x ) // 10 11 12 13 14 15 16 17 18 19
}
Set
println("hello set , scala")
// Empty set of integer type
var s1 : Set[Int] = Set()
// Set of integer type
var s2 : Set[Int] = Set(1,3,5,7)
var s3 = Set(1,3,5,7)
println(s1)
println(s2)
println(s3)
val fruit = Set("apples", "oranges", "pears")
val nums: Set[Int] = Set()
println( "Head of fruit : " + fruit.head )
println( "Tail of fruit : " + fruit.tail )
println( "Check if fruit is empty : " + fruit.isEmpty )
println( "Check if nums is empty : " + nums.isEmpty )
val fruit1 = Set("apples", "oranges", "pears")
val fruit2 = Set("mangoes", "banana")
// use two or more sets with ++ as operator
// 使用 ++ 运算符
var fruit3 = fruit1 ++ fruit2
println( "fruit1 ++ fruit2 : " + fruit3 )
// use two sets with ++ as method
// .++ 方法
val fruit4 = fruit1.++(fruit2)
println( "fruit1.++(fruit2) : " + fruit4 )
val num_test = Set(5,6,9,20,30,45)
// find min and max of the elements
println( "Min element in Set(5,6,9,20,30,45) : " + num_test.min )
println( "Max element in Set(5,6,9,20,30,45) : " + num_test.max )
val num1 = Set(5,6,9,20,30,45)
val num2 = Set(50,60,9,20,35,55)
// find common elements between two sets
// .& 共同的元素
println( "num1.&(num2) : " + num1.&(num2) )
// intersect 交集
println( "num1.intersect(num2) : " + num1.intersect(num2) )
// 交集:
println(Set(1,2,3) intersect Set(2,4))
// 并集:
println( Set(1,2,3) ++ Set(2,4))
// 差集:
println( Set(1,2,3) -- Set(2,4)) //得到 Set(1,3)
println(Set(1,2,3) + (2,4))
// 遍历set 集合
for( e <- fruit3) {
println(e)
}
// set集合元素的访问
println(fruit3("apples")) //true
// set集合元素的访问
println(fruit3("appes")) //false
// 以上是不可变 set 集合,collection.mutable.Set 是可变set 集合
val s = collection.mutable.Set(1, 2, 3)
println(s)
s += 4
s -= 2
println(s)
List
println("hello list , scala")
// List of Strings
val fruit: List[String] = List("apples", "oranges", "pears")
// List of Integers
val nums: List[Int] = List(1, 2, 3, 4)
// Empty List.
val empty: List[Nothing] = List()
// Two dimensional list
val dim: List[List[Int]] =
List(
List(1, 0, 0),
List(0, 1, 0),
List(0, 0, 1)
)
val Nil_list = Nil
println(fruit)
println(nums)
println(empty)
println(dim)
println(Nil_list) //List()
// Scala List 独特的 连接运算“::”(cons)和“:::”
// “::” 这个运算符要求前一个是 元素, 后一个是 List。
// 两个都是 元素 或 都是 List,是不对的。
// 如果两个都是List,要用 三个冒号的“:::”。
// Nil 表示空的list-empty list
// List of Strings
val fruit_kk = "apples" :: ("oranges" :: ("pears" :: Nil))
// List of Integers
val nums_kk = 1 :: (2 :: (3 :: (4 :: Nil)))
// Empty List.
val empty_kk = Nil
// Two dimensional list
val dim_kk = (1 :: (0 :: (0 :: Nil))) ::
(0 :: (1 :: (0 :: Nil))) ::
(0 :: (0 :: (1 :: Nil))) :: Nil
println(fruit_kk)
println(nums_kk)
println(empty_kk)
println(dim_kk)
val qwer = nums_kk ::: dim_kk
println(qwer)
// Reverse List Order:
val fruit_oo = "apples" :: ("oranges" :: ("pears" :: Nil))
println( "Before reverse fruit : " + fruit_oo )
println( "After reverse fruit : " + fruit_oo.reverse )
// Tabulating a Function:
val mul = List.tabulate( 4,5 )( _ * _ )
println( "mul : " + mul )
// Repeats apples three times.
val fruit_re = List.fill(3)("apples")
println( "fruit : " + fruit_re )
// Repeats 2, 10 times.
val num_re = List.fill(10)(2)
println( "num : " + num_re )
Tuple
元组(Tuple)
笛卡尔积中每一个元素(d1,d2,…,dn)叫作一个n元组(n-tuple)或简称元组。
元组是关系数据库中的基本概念,关系是一张表,表中的每行(即数据库中的每条记录)就是一个元组,每列就是一个属性。 在二维表里,元组也称为记录。
println("hello tuple , scala")
//a tuple can hold objects with different types but they are also immutable
val t = (1, "hello", Console) //定义一个tuple 元组
println(t)
println(t._1) //访问tuple 的元素
println(t._2)
println(t._3)
val tuple = Tuple3(234,"sdsdsd",Console)
println(tuple)
def getUserInfo = ("Al", 42, 200.0) //定义一个函数,函数返回元组
println(getUserInfo)
t.productIterator.foreach(println) //遍历tuple
val tuple_hello = Tuple2(1,"fsdsfdf")
println(tuple_hello)
val tuple_t4 = Tuple4(23,234,"sdsd","ytu")
println(tuple_t4)
tuple_t4.productIterator.foreach{ i => println("Value = " + i )} //遍历tuple
val pair = Pair(2,5);
println("pair="+pair)
// E:\test-scala\tuple_hello.scala:34: error: not found: value Tuple34
// val tuple_any = Tuple34()
// ^
// one error found
// val tuple_any = Tuple34() //仅支持到Tuple22
// println(tuple_any)
// Deprecated
// (Since version 2.11.0) Use built-in tuple syntax or Tuple3 instead
val triple = Triple(1,"w323",Console) //三元组 same as Tuple3 (1,"two",3.0) or (1,"two",3.0)
println("triple===="+triple)
val ttttt = (4,3,2,1)
val sum = ttttt._1 + ttttt._2 + ttttt._3 + ttttt._4
println( "Sum of elements: " + sum )
println("Concatenated String: " + ttttt.toString() )
Map
import scala.collection.mutable.Map
import java.util.Calendar
println("scala map")
//基本的映射关系
//可变mutable map
val extensions = Map("steve" -> 100, "bob" -> 101, "joe" -> 201)
println(extensions("steve")) //根据key获取value
println(extensions("bob"))
println(extensions("joe"))
def hello_function(m: Int): Int = {
m + 2
}
//映射函数
extensions += ("function" -> hello_function(1))
println(extensions("function"))
extensions += ("1" -> 1)
extensions += ("2" -> 1)
extensions += ("3" -> 3)
extensions += ("Monday" -> Calendar.MONDAY)
extensions += ("Tuesday" -> Calendar.TUESDAY)
extensions += ("Wednesday" -> Calendar.WEDNESDAY)
extensions += ("Thursday" -> Calendar.THURSDAY)
extensions += ("Friday" -> Calendar.FRIDAY)
extensions += ("Saturday" -> Calendar.SATURDAY)
extensions += ("Sunday" -> Calendar.SUNDAY)
extensions.foreach(arg => println(arg))
println("===============================")
for (e <- extensions) { //相当于遍历entry
println(e)
}
for ((k, v) <- extensions) { //可以的到key-value 对偶
println("[key=" + k + ",vlue=" + v + "]")
}
for (k <- extensions.keySet){
println(k)
}
// 单独拿出值
for (v <- extensions.values){
println(v)
}
//不可变集合
val scores = scala.collection.immutable.Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8)
for ((k, v) <- scores) { //可以的到key-value 对偶
println("[key=" + k + ",vlue=" + v + "]")
}
println("============================")
val mutable_map: Map[String,Integer] = Map() //声明一个空的map
for ((k, v) <- scores) { //可以的到key-value 对偶
mutable_map += (k -> v)
}
println(mutable_map)
val map2: Map[String,Int] = Map()
for ((k, v) <- extensions) { //可以的到key-value 对偶
map2(k) = v //改变k 的值
}
println(map2)
val map43 = new java.util.TreeMap[String,Int]
for( (k,v) <- extensions) {
map43.put(k,v) //TreeMap的put方法,也是map的put方法
}
println(map43)
Range
以下是在scala的命令行中做的测试
scala> 1 to 10
res0: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
scala> 1 until 10
res1: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9)
scala> 1 to 10 by 3
res2: scala.collection.immutable.Range = Range(1, 4, 7, 10)
scala> 10 to 1 by -3
res3: scala.collection.immutable.Range = Range(10, 7, 4, 1)
scala> 1L to 10L by 3
res4: scala.collection.immutable.NumericRange[Long] = NumericRange(1, 4, 7, 10)
scala> 1.1f to 10.3f by 3.1f
res5: scala.collection.immutable.NumericRange[Float] = NumericRange(1.1, 4.2, 7.2999997)
scala> 1.1 to 10.3 by 3.1
res9: scala.collection.immutable.NumericRange[Double] = NumericRange(1.1, 4.2, 7.300000000000001)
scala> 'a' to 'g' by 3
res6: scala.collection.immutable.NumericRange[Char] = NumericRange(a, d, g)
scala> BigInt(1) to BigInt(10) by 3
res7: scala.collection.immutable.NumericRange[BigInt] = NumericRange(1, 4, 7, 10)
scala> BigDecimal(1.1) to BigDecimal(10.3) by 3.1
res8: scala.collection.immutable.NumericRange.Inclusive[scala.math.BigDecimal] = NumericRa
scala>
Range 支持的类型从上面可以看到有 Long , Float ,Double, Char , BigInt , BigDecimal
也可以把一个Range 类型 转换成 List 类型,如下,
scala> 1990 until 2011 toList
warning: there was one feature warning; re-run with -feature for details
res10: List[Int] = List(1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010)
scala>
把 Range 类型转换为 Array 类型,如下,
scala> 1990 until 2011 toArray
warning: there was one feature warning; re-run with -feature for details
res11: Array[Int] = Array(1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010)
scala>
对Range 类型的遍历
ranges_app_main.scala
for (a <- 1 to 10) {
println("Value of a: " + a);
}
val r = 1 to 10
for (a <- r) {
println("Value of a: " + a)
}
r.foreach((i: Int) => println("value i:" + i))
运行并输出,
C:\WorkSpace6-scala\scala-train\src\com\usoft>scala ranges_app_main.scala
Value of a: 1
Value of a: 2
.......
官网文档,
http://docs.scala-lang.org/overviews/collections/maps.html
还有这篇博文
http://www.ivanpig.com/blog/?p=464
================================END================================