scala总结

 --》语言api说明文档
--》不用库
最根本的类Any
--》scala常用库
scala.collection.mutable.Map(里面有zip)
--》运行脚本
scala分为脚本和程序

运行scala脚本用  scala 文件名.scala
--》通常Unit只用来声明函数或方法的返回值,其他场景基本是没有意义的
--》删除scala sudo apt-get remove scala
-->安装scala
1.在http://www.scala-lang.org/download/2.11.8.html下载tar格式的文件(不是源代码,是编译好的)
2.复制到home文件夹
3.tar -xzvf scala-2.11.8
4.sudo gedit /etc/profile 在其中添加
export SCALA_HOME=/home/zhaodezan/scala-2.11.8
export PATH=$SCALA_HOME/bin:$PATH
5.source /etc/profile
6.验证 scala -version
   总结:安装步骤为:下载编译好的文件并解压,添加环境变量,验证
--》scala hello world程序
1.在myproject下创建src/org/examples文件夹
2.在其下创建Hello.scala文件,源代码为
package org.example
object Hello{
def main(args:Array[String]){   //固定模式,可以背下来
println("hello,world") //必须用双引号,复制时必须去掉注释,否则报错
}
}
3.在src文件夹下执行 
scalac org/examples/Hello.scala
scala  org.examples.Hello
         1)先scalac再scala 2)scala将生成package包名命名的文件夹3)scala 文件名.类名(类名没有.class后缀)
--》循环for命令
1.创建keshan.scala文件
2.书写代码
object Test{
        def main(args:Array[String]){
                for(arg<-args)
                        {
                                println(arg)
                        }
        }
}
3.编译scalac keshan.scala
4.运行scala  Test zhao de zan
--》scala数组
>val greetStrings = new Array[String](3) //创建一个长度为3的字符串数组
greetStrings: Array[String] = Array(null, null, null)
>greetStrings(0)="Hello"
>greetStrings(1)=","
>greetStrings(2)="world!\n"
>for(i<-0 to 2){print(greetStrings(i))}
将输出 Hello,world!
--》scala二维数组
scala> val matrix = Array.ofDim[Int](2,3) //构建二维数组
matrix: Array[Array[Int]] = Array(Array(0, 0, 0), Array(0, 0, 0)) 
scala> matrix(1)(1)=5                                                  //数组元素的引用
scala> println(matrix(1)(1))
5
--》数组的长度length
scala> val a = Array(1,3,4)
a: Array[Int] = Array(1, 3, 4)

scala> a.length
res0: Int = 3

scala> val b = Array(5,6,7)
b: Array[Int] = Array(5, 6, 7)

scala> b.length
res1: Int = 3

scala> val c = a.zip(b)
c: Array[(Int, Int)] = Array((1,5), (3,6), (4,7))

scala> c.length
res2: Int = 3

--》打印二维数组全部
scala> val a = Array(Array(1,2,3),Array(4,5,6))
a: Array[Array[Int]] = Array(Array(1, 2, 3), Array(4, 5, 6))
scala> val b = sc.parallelize(a)
b: org.apache.spark.rdd.RDD[Array[Int]] = ParallelCollectionRDD[2] at parallelize at <console>:23
scala> b.foreach(x=>(x.foreach(i=>println(i))))
--》数组形式打印二维数组
scala> var a = Array(Array(1,2),Array(4,5))
a: Array[Array[Int]] = Array(Array(1, 2), Array(4, 5))
scala> a.foreach(one=>{println(one.mkString(" "))})
1 2
4 5
--》foreach的_用法
scala> val a = Array(1,2,3)
a: Array[Int] = Array(1, 2, 3)
scala> a.foreach(_=>println(a(2)))
3
3
3


--》类,没有构造函数,自动运行里面的指令了
>class A{print("hello,world\n")}
defined class A
>val a = new A
hello,world
a: A = A@1c1159ee
--》程序休眠
Thread.sleep(1000000)
--》var和val的区别
var和java的变量相同,初始化之后还可以继续复制
val初始化之后就不再可以赋值了
>var a=1
>a=8
上述句子可以
>val a=2
>a=4
将报错error: reassignment to val
--》类变量的全局性
scala> class A{
     |   val a=new Array[Int](1)
     |   fun(a)
     |   println(a(0))
     |   def fun(b:Array[Int]){
     |    b(0)=1
     |   }
     | }
defined class A

scala> val b = new A
1
b: A = A@50530c6d

注意,若将println(a(0))改为println(a)
则会打印
scala> val b  =new A
[I@7067ba82
b: A = A@2a05e675
只是打印的资源的位置

--》对象成员的引用
scala> b.a
res1: Array[Int] = Array(1)

scala> b.a(0)
res2: Int = 1

scala> b.a(1)
java.lang.ArrayIndexOutOfBoundsException: 1
  ... 33 elided
--》scala shell中要多行打印,
则在输入下一行的时候按回车键即可
结束输入,则按esc键,再按回车键
--》zip
scala> List(1,2,3).zip(List("a","b","c"))
res0: List[(Int, String)] = List((1,a), (2,b), (3,c))
将两个列表的元素合成一个由元素对组成的列表中

scala> val a = Array(1,2,3,4,5)
a: Array[Int] = Array(1, 2, 3, 4, 5)
scala> val b = Array(6,7,8,9,10)
b: Array[Int] = Array(6, 7, 8, 9, 10)
scala> val c = a.zip(b)
c: Array[(Int, Int)] = Array((1,6), (2,7), (3,8), (4,9), (5,10))
将两个数组合在一起


将一个二维数组和一个一维数组绑定在一起,用于将训练集等的绑定
scala> val a = new Array[Array[Float]](2)
a: Array[Array[Float]] = Array(null, null)
scala> a(0) = Array(1,2,3,4,5)
scala> a
res6: Array[Array[Float]] = Array(Array(1.0, 2.0, 3.0, 4.0, 5.0), null)
scala> val b = Array(6)
b: Array[Int] = Array(6)
scala> a.zip(b)
res7: Array[(Array[Float], Int)] = Array((Array(1.0, 2.0, 3.0, 4.0, 5.0),6))


--》基本集合类List
scala> val numbers = List(1,2,3,4)
numbers: List[Int] = List(1, 2, 3, 4)
--》函数组合器,map将一个集合映射map到另一个集合
--》string类型转换为Float类型
scala> val a ="12.23".toFloat
a: Float = 12.23
scala> numbers.map((i:Int)=>i*2)
res3: List[Int] = List(2, 4, 6, 8)
--》集合类的foreach方法用于遍历,不改变集合的值
scala> val num = List(1,2,3,4)
num: List[Int] = List(1, 2, 3, 4)

scala> num.foreach((x:Int)=>println(x*2))
2
4
6
8
--》基本集合类Set
scala> Set(1,1,2)
res1: scala.collection.immutable.Set[Int] = Set(1, 2)
--》println
直接打印字符串,注意必须是双引号,必须是括号
>println("hello,world")
--》println直接打印列表
scala> val a = List(1,2,3,4)
a: List[Int] = List(1, 2, 3, 4)

scala> println(a)
List(1, 2, 3, 4)
--》println间接打印数组
scala> val a= Array(1,2,3,4)
a: Array[Int] = Array(1, 2, 3, 4)

scala> println(a)
[I@79675800

scala> a.foreach((x:Int)=>println(x))
1
2
3
--》
scala> Array.range(0,4)
res8: Array[Int] = Array(0, 1, 2, 3)
--》打印乱码
scala> val a = Array(1,2,3)
a: Array[Int] = Array(1, 2, 3)
scala> println(a)
[I@5f33f2f3
scala> a.foreach(x=>println(x))
1
2
3
--》scalatest 测试程序,参考链接http://www.scalatest.org/quick_start
注意事项,将jar和scala程序放到同一个目录下
--》用scala调用java的库,并调用启动python的脚本
在Hello.scala中输入如下程序
import java.io.BufferedReader
import java.io.InputStreamReader
object Hello{
def main(args:Array[String]){
val pr = Runtime.getRuntime().exec("python test.py")
            val in = new BufferedReader(new InputStreamReader(pr.getInputStream()))  
            var line = in.readLine
while (line != null) {
System.out.println("line is")
                System.out.println(line+2)
line = in.readLine
            }  
            in.close()
            pr.waitFor()
            System.out.println("end")
println("hello,world")
}
}
建立test.py文件并复制如下数据
import sys


import matplotlib.pyplot as plt
import numpy as np
import scipy.io as sio
import argparse
import dlib
from skimage import io

def run_dlib_selective_search(image_name):
    img = io.imread(image_name)
    rects = []
    dlib.find_candidate_object_locations(img,rects,min_size=50)
    proposals = []
    for k,d in enumerate(rects):
        templist = [d.left(),d.top(),d.right(),d.bottom()]
        proposals.append(templist)
    proposals = np.array(proposals)
    return proposals


if __name__ == '__main__':
obj_proposals = run_dlib_selective_search("/home/zhaodz/program/fast-rcnn/data/demo/000004.jpg")
print obj_proposals


输入scalac Hello.scala
输入scala  Hello
--》用Scala读入文件
import scala.io.Source
val lines = Source.fromFile("/home/zhaodz/tmp/dd.txt")
--》读取文件(使用了java的函数)
import java.io.BufferedReader;
import java.io.FileReader;
object Hello{
def main(args:Array[String]){  
var fr=new FileReader("dd.txt")
var br = new BufferedReader(fr)
var s = br.readLine()
while(s!=null){
println(s)
s = br.readLine()
}
}
}
--》替换(接上面程序)
var ss = s.replace("1","2") //将1替换为2,若2改为"",则表示删除1这个字符串
println(ss)
--》定义一个List
scala> val nums = List(1,2,3,4,5)
scala> nums.slice(2,4)
res20: List[Int] = List(3, 4)
--》定义一个空的List
var result = List[Int]()
--》在List前面增加一个数
scala> val when = "AM" :: "PM" :: List()
when: List[String] = List(AM, PM)
scala> val when = "AM" :: "PM" ::days
when: List[String] = List(AM, PM, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday)
--》在List后面增加一个数
scala> result.::(2)
res24: List[Int] = List(2)
注意有.  否则报错

--》定义迭代器
scala> val a = Iterator("baidu","google","sougou")
a: Iterator[String] = non-empty iterator
--》打印迭代器
scala> while(a.hasNext){println(a.next())}
baidu
google
sougou
--》列表转化为迭代器
scala> val a = List(1,2,3)
a: List[Int] = List(1, 2, 3)
scala> val b = a.iterator
b: Iterator[Int] = non-empty iterator
scala> while(b.hasNext){println(b.next())}
1
2
3

--》随机数
scala> import scala.util.Random
scala> val a = new Random()
scala> a.nextInt(20)//0-19 包括19
res10: Int = 14
-->映射
--》构建映射
scala> val scores = Map("Alice"->10,"Blob"->3,"Cindy"->8)
scores: scala.collection.immutable.Map[String,Int] = Map(Alice -> 10, Blob -> 3, Cindy -> 8)
--》获取映射中的值
scala> scores("Blob")
res30: Int = 3

也可以用java的代码
scala> scores.get("Blob")
res31: Option[Int] = Some(3)

posted @ 2018-04-17 10:01  开往春天的拖拉机  阅读(240)  评论(0编辑  收藏  举报