listscala当前位置遍历_scala字符串(string)数组(array),
映射(。。。
字符串
去除收尾空格
val aaaaa = " 546 "
aaaaa.length = 5
去除前缀后缀
val aaaaa = "xxxxx546546yyyyy"
aaaaa.stripPrefix("xxxxx").stripSuffix("yyyyy")
结果:
res1: String = 546546
替换字符串
val aaaaa = "xxxxx546546yyyyy"
结果:
res2: String = yyyyy546546yyyyy
正则提取
import scala.util.matching.Regex
val pattern = new Regex("[a-zA-Z]+")
pattern.findAllIn(aaaaa).toArray
正则替换
使⽤字符串⾃带的replaceALL替换
val a = "aaaaa11111"
如果要替换括号"()",需要注意如果只有半个括号,会报错。
如果想只替换半个扩号,那么括号需要⽤⽅括号框起来"[]"就能正常运⾏。
val a = "aaaaa(11111)"
使⽤正则表达式中的replaceAllIn
val b = "aaaaa11111"
val regex = "= [A-Za-z]+".r
val newString = placeAllIn(b, "a")
replaceall()
拼接字符串
val str3 = at(str2)
数组
部分转载⾃:【快学scala】
常⽤
若长度固定则使⽤Array,若长度可能有变化则使⽤ArrayBuffer 提供初始值时不要使⽤new
⽤()来访问元素
⽤for (elem
scala> var intArray=Array(1,2,3)
intArray: Array[Int] = Array(1, 2, 3)
// to length-1
scala> for(i
1
2
3
// until ⼩于length
scala> for(i
1
2
3
// 正确遍历数组的姿势
scala> for(i
1
2
3
//倒叙遍历
scala> for(i
3
2
1
⽤for (elem
// ⽣成新的数组原数组不变
scala> var intArray=Array(1,2,3)
intArray: Array[Int] = Array(1, 2, 3)
scala> for(i
res6: Array[Int] = Array(2, 4, 6)
scala> intArray
res7: Array[Int] = Array(1, 2, 3)
scala> var intArray2=for(i
intArray2: Array[Int] = Array(2, 4, 6)
// 加⼊过滤条件
scala> var intArray2=for(i2) yield i*2
intArray2: Array[Int] = Array(6)
//转换类型,把array中的字符串类型转化为Int
var StringArray=Array("1","2","3")
StringArray: Array[String] = Array(1, 2, 3)
scala> for(i
res8: Array[Int] = Array(1, 2, 3)
//也可以直接使⽤map
StringArray.map(_.toDouble)
//⽤map的时候要注意,⽐如遇见嵌套的Array就需要使⽤case来处理
//⽐如array(array("ID:1111","TEL:1233","NAME:ASDF"),array("ID:1221","TEL:1211","NAME:DFAS"))
//我们需要对array中的⼦数组做处理,⽐如只去ID项
array = array.map{case Array(x,y,z)=>Array(x)}
Scala数组和java数组可以互操作;⽤ArrayBuffer,使⽤scalacollection.JavaConversions中的转换函数
如果数组在rdd中,假设结构为(id,array),若想要打印rdd内容并看到数组内容可以a.take(10).foreach(v => println(v._1, v._2.mkString(",")))
-def isEmpty: Boolean 判断当前数组是否为空。
val a = Array(1, 2, 3, 4, 5)
a.isEmpty // return false
-def intersect(that: collection.Seq[T]): Array[T] 取两个集合的交集
val a = Array(1, 2, 3, 4, 5)
val b = Array(3, 4, 6)
val c = a.intersect(b)//也可以这样 val c = c intersect b
println(c.mkString(",")) //return 3,4
10.其他
//求和
scala> intArray.sum
res8: Int = 6
//求最⼩值
scala> intArray.min
res9: Int = 1
//求最⼤值
scala> intArray.max
res10: Int = 3
// make String
scala> intArray.mkString(",")
res11: String = 1,2,3
scala> intArray.mkString("")
res12: String = <1,2,3>
val first = intArray(0) // 读取第⼀个元素
intArray(3) = 100 // 替换第四个元素为100
有时候会出现错误:scala.MatchError: [Ljava.lang.String;@51443799 (of class [Ljava.lang.String;)这是Array中元素和调⽤时元素不匹配造成的,⽤case时常会遇见这种问题,⼏种⽅法可以预防。
问题重现:
scala> val Array(k, v) = "1,2".split(",")
k: String = 1
v: String = 2
scala> val Array(k, v) = "1,2,3".split(",")
scala.MatchError: [Ljava.lang.String;@508dec2b (of class [Ljava.lang.String;)
11.1. 可以加⼊if来判断数组是否为空,或者直接判断数组长度
11.2.可以使⽤_*来代替后续的元素
val Array(k, v, _*) = Array(1, 2, 3, 4, 5)
#k: Int = 1
#v: Int = 2
⽣成数组
1.Array.ofDim[Double](3,4) //⽣成3*4的⼆维数组,初始值为0.0
2.Array.ofDim[Double](3) //⽣成length=3的数组,初始值为0.0
ptyDoubleArray() //⽣成⼀个泛型为double的空数组
⽤fill创建和填充数组
scala> val array1 = Array.fill(3)("0")
array1: Array[String] = Array("0","0", "0")
13.合并数组
⽤Array中的concat可以合并数组元素
import Array._
val array = at(array1,array2,array3)
14.⽐较数组
判断两个数组是否相等
Array("1","2")==Array("1","2") 是false。
Array("1","2").equal(Array("1","2")) 是false。
需要使⽤sameElements
Array("1","2") sameElements Array("1","2") 是true
scala中array⽐较特殊,转成序列或者列表会好⼀些。
例如:
List("1","2") == List("1","2") //true
List("1","2") sameElement List("1","2") //true
如果想知道两个数组(a,b)是否是b被a包含的关系,可以使⽤相交再相等的⽅式
val a = Array("1","2","3").
val b = Array("1","2")
val c = a.intersect(b) //a = Array("1","2")
c sameElement b //true
15.查元素
使⽤find可以查符合条件的第⼀个元素
⽐如嵌套的数组中array(array("x","y","z"),array("a","b","c"),array("a","w","e")……)
查数组中⼦数组第⼀个元素等于"a"的第⼀个⼦数组
array.find({x:Array[String] => x(0) == "a"})
查出来的结果是Option类型,Some(……),这种类型⾥的数据不能直接拿出来⽤,需要⽤到get⽅法取值
array.find({x:Array[String] => x(0) == "a"}).get.mkString(",")
使⽤get,如果查不到会报以下的错误,并返回⼀个空字符串。
Spark--java.util.NoSuchElementException: at at
单条这种情况,最后也有返回值,影响不是很⼤,但是如果是在dataframe中遍历的时候,每条都报这个错误,最后程序就⽆法运⾏。所以通常不⽤get,使⽤getOrElse,查不到就返回⾃⼰设定的⼀个值,后⾯如果不需要,可以⼿动过滤掉。
array.find({x:Array[String] => x(0) == "a"}).getOrElse(Array("error")).mkString(",")
1.定长数组
val nums = new Array[Int](10)//所有元素初始化为0
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论