Scala Array方法一览

Scala:Array(集合、序列)

1、++
合并集合,并返回一个新的数组,新数组包含左右两个集合对象的内容。(不去重)

val a=Array(1,2,3)
val b=Array(4,5,6)
val c= a ++ b

2、++:
合并集合,并返回一个新的数组,右边操纵数的类型决定着返回结果的类型

val a = List(1,2)
val b = scala.collection.mutable.LinkedList(3,4)
val c = a ++: b

注:c的类型是:scala.collection.mutable.LinkedList

3、+:
在数组前面添加一个元素,并返回新的对象

val a = List(1,2)
val c = 0 +: a // c中的内容是 (0,1,2)

4、:+
在数组末尾添加一个元素,并返回新对象

val b = List(3,4)
val c = b :+ 0 // c中的内容是 (3,4,0)

5、/:
对数组中所有的元素进行相同的操作,foldLeft的简写

val a=List(1,2,3,4)
val c=(10 /: a)(_+_)   //10+1+2+3+4  计算方向 ——>
val d=(10 /: a)(_*_)   //10*1*2*3*4  计算方向 ——>

6、 :
对数组中所有的元素进行相同的操作,foldRight的简写

val a=List(1,2,3,4)
val c=(a :\ 10)(_+_)   //1+2+3+4+10  计算方向 <——
val d=(a :\ 10)(_*_)   //1*2*3*4*10  计算方向 <——

7、addString
addString(b:StringBuilder):StringBuilder
将a数组中的元素逐个添加到b中

val a=List(1,2,3,4)
val b=new StringBuilder()
val c= a.addString(b)      //c中的内容是:1234

addString(b:StringBuilder,sep:String):StringBuilder
将a数组中的元素逐个添加到b中,并且每个元素用sep分隔符分开

val a=List(1,2,3,4)
val b=new StringBuilder()
val c= a.addString(b,",")      //c中的内容是:1,2,3,4

addString(b:StringBuilder,start:String,sep:String,end:String):StringBuilder
将a数组中的元素逐个添加到b中, 同上,在首尾各加一个字符串,并指定sep分隔符

val a=List(1,2,3,4)
val b=new StringBuilder()
val c= a.addString(b,"{",",","}")    //c中的内容是:{1,2,3,4}

8、aggregate
聚合计算,aggregate是柯里化方法
示例:为了方便理解,把 aggregate 的两个参数分别封装成两个方法,并把分区和不分区的计算过程分别打印出来

def seqno(m: Int, n: Int): Int = {
val s = “seq_exp = %d + %d”
println(s.format(m, n))
m + n
}

def combine(m: Int, n: Int): Int = {
val s = “com_exp = %d + %d”
println(s.format(m, n))
m + n
}

def main(args: Array[String]) {
val a = List(1, 2, 3, 4)

val b = a.aggregate(5)(seqno, combine) // 不分区
println("b = " + b)
/**
 * seq_exp = 5 + 1
 * seq_exp = 6 + 2
 * seq_exp = 8 + 3
 * seq_exp = 11 + 4
 * b = 15
 */

val c = a.par.aggregate(5)(seqno, combine) // 分区
println("c = " + c)
/**
 * seq_exp = 5 + 3
 * seq_exp = 5 + 2
 * seq_exp = 5 + 4
 * seq_exp = 5 + 1
 * com_exp = 6 + 7
 * com_exp = 8 + 9
 * com_exp = 13 +17
 * c = 30
 */
}

通过上面的运算不难发现,不分区时,seqno 是把初始值顺序和每个元素相加,把得到的结果与下一个元素进行运算。

分区时,seqno 是把初始值与每个元素相加,但结果不参与下一步运算,而是放到另一个序列中,由第二个方法 combine 进行处理。

上面过程可以简写为

val b = a.aggregate(5)(_+_,_+_) // 不分区
val c = a.par.aggregate(5)(_+_,_+_) // 分区

9、apply(i:int)
取出指定索引处的元素

val a=List(1,2,3,4)
val first=a.apply(0)   //读取第一个元素
等同于:val first=arr(0)  //读取第一个元素

10、canEqual
判断两个对象是否可以进行比较

11、charAt(index: Int)
获取index索引处的字符,这个方法会执行一个隐式的转换,将Array[T]转换为 ArrayCharSequence,只有当T为char类型时,这个转换才会发生。

val chars = Array('a','b','c')
val c=chars.charAt(0)   //c的结果为 a

12、clone()
创建一个副本

val chars = Array('a','b','c')
val newchars = chars.clone()

13、collect
通过执行一个并行计算(偏函数),得到一个新的数组对象

val chars = Array('a','b','c')
//通过下面的偏函数,把chars数组的小写a、b转换为大写的A、B
val fun:PartialFunction[Char, Char]={
    case 'a' => 'A'
    case 'b' => 'B'
    case x => x
}
chars.collect(fun)     // 输出结果:Array(A, B, c)

14、collectFirst
在序列中查找第一个符合偏函数定义的元素,并执行偏函数计算

var arr = Array(1,"a","b")
//定义一个偏函数,要求当被执行对象为Int类型时,进行乘100的操作,
//对于上面定义的对象arr来说,只有第一个元素符合要求
val fun:PartialFunction[Any,Int]={
    case x:Int => x*100
}
//计算
val value = arr.collectFirst(fun)

//另一种写法
val value = arr.collectFirst({case x:Int => x*100})

15、combinations(n: Int)
排列组合,这个排列组合会选出所有包含字符不一样的组合,对于 “abc”、“cba”,只选择一个,参数n表示序列长度,就是几个字符为一组

val arr = Array("a","b","c")
val newarr = arr.combinations(2)
newarr.foreach((item) => println(item.mkString(",")))
/**
a,b
a,c
b,c
*/

16、contains
序列中是否包含指定对象,包含则输出true,不包含则输出false

val arr = Array("a","b","c","d","e","f")
arr.contains("a")  // true
arr.contains("s")  // false

17、containsSlice
判断当前序列中是否包含另一个序列,如果另一个序列中的元素连续且相同于当前序列,则返回true,反之则返回false

val a = List(1,2,3,4)
val b = List(1,2)
a.containsSlice(b)  //true

val c = List(2,1)
a.containsSlice(c)  //false

val d = List(1,4)
a.containsSlice(d)  //false

18、copyToArray
此方法还有两个类似的方法:

copyToArray(xs: Array[A], start: Int): Unit
copyToArray(xs: Array[A], start: Int, len: Int): Unit
val a = Array('a','b','c')
val b:Array[Char] = new Array(5)   //定义一个长度为5的char类型数组b
a.copyToArray(b)   //复制数组a中元素至数组b
b  //查看b中元素  Array[Char] = Array(a, b, c, ?, ?)
val b:Array[Char] = new Array(5)
a.copyToArray(b,2)   //从数组b索引为2的位置开始,复制数组a中元素至数组b
b   //查看b中元素  Array[Char] = Array(?, ?, a, b, c)
val b:Array[Char] = new Array(5)
a.copyToArray(b,2,2)   //从数组b索引为2的位置开始,复制数组a中元素至数组b,复制的元素个数为2
b   //查看b中元素  Array[Char] = Array(?, ?, a, b, ?)

19、copyToBuffer
将数组中的内容拷贝到Buffer中
//前提:导入可变集合

import scala.collection.mutable._

val a = Array('a','b','c')
val b:ArrayBuffer[Char] = ArrayBuffer()   //定义Buffer类型数组b
a.copyToBuffer(b)   //复制数组a中元素至数组b
b   //查看数组b: ArrayBuffer(a, b, c)
b.toString   //输出数组b: String = ArrayBuffer(a, b, c)
b.append('d')   //为数组b添加元素'd'
b   //查看数组b:ArrayBuffer(a, b, c, d)
b.append('e')   //为数组b添加元素'e'
b   //查看数组b:ArrayBuffer(a, b, c, d, e)

//将数组b按自定义样式输出

b.mkString("{","^","}")   // 输出结果:{a^b^c^d^e}

20、correspond
判断两个序列长度以及对应位置元素是否符合某个条件。如果两个序列具有相同的元素数量并且p(x, y)=true,返回结果为true

val a = Array(1,2,3)
val b = Array(3,4,5)
//检查a和b长度是否相等,并且a中元素是否小于b中对应位置的元素
a.corresponds(b)(_<_)    //true

val b = Array(1,4,5)
a.corresponds(b)(_<_)   // false

val b = Array(4,5,6,7)
a.corresponds(b)(_<_)   // false

val b = Array(4,5)
a.corresponds(b)(_<_)   // false

21、count

统计符合条件的元素个数
val a = Array(1,2,3)
//统计大于2的元素个数
a.count(x => x>2)   //1
//统计大于0的元素个数
a.count(x => x>0)   //3
//统计大于1的元素个数
a.count(x => x>1)   //2

22、diff
计算当前数组与另一个数组的不同。将当前数组中没有在另一个数组中出现的元素返回

val a = Array(1,2,3,4)
val b = Array(4,5,6)
//计算数组a中没有在数组b中出现的元素
a.diff(b)   //结果:Array(1, 2, 3)
//计算数组b中没有在数组a中出现的元素
b.diff(a)   //结果:Array(5, 6)

23、distinct
去除当前集合中重复的元素,只保留一个

val a = Array(1,1,2,2,3,3,5,5,6,7,7)
//去除数组a中重复的元素
val c = a.distinct   //结果:Array(1, 2, 3, 5, 6, 7)

24、drop(n: Int)

将当前序列中前 n 个元素去除后,作为一个新序列返回
val a = Array(1,2,3,4)
//去除当前序列的前2个元素
a.drop(2)   //结果:Array(3, 4)

25、dropRight(n: Int)
功能同 drop,去掉尾部的 n 个元素

val a = Array(1,2,3,4)
//去除当前序列的前2个元素
a.dropRight(2)   //结果:Array(1, 2)

26、dropWhile
去除当前数组中符合条件的元素,这个需要一个条件,就是从当前数组的第一个元素起,就要满足条件,直到碰到第一个不满足条件的元素结束(即使后面还有符合条件的元素),否则返回整个数组
//下面去除大于2的元素直至条件不满足,第一个元素3满足,第二个元素2不满足

val a = Array(3,2,3,4)
val c = a.dropWhile({x:Int => x>2})   //Array(2, 3, 4)

//简写
val c = a.dropWhile(_>2)   //Array(2, 3, 4)

27、endsWith
判断是否以某个序列结尾,元素连续且顺序相同

val a = Array(3,2,3,4)
val b = Array(3,4)
//判断序列a是否以序列b结尾
a.endsWith(b)    // true
//判断序列a是否以序列c结尾
val c = Array(2,3)
a.endsWith(c)    // false

28、exists
判断当前数组是否包含符合条件的元素

val a = Array(3,2,3,4)
//判断数组a是否包含元素3
a.exists(_==3)     // true

//另一种写法:
a.exists(x=>x==3)  // true

//判断数组a是否包含元素1
a.exists(x=> x==1) // false
/找到符合条件的第一个元素就停止(即使后面还有符合条件的元素),存在则返回true,不存在则返回false
//输出序列a元素,直至出现大于1的元素为止
a.exists(x=> {println(x);x>1})
/**
3
Boolean = true
*/

//输出序列a元素,直至出现大于3的元素为止
a.exists(x=> {println(x);x>3})

29、filter
取得当前数组中符合条件的元素,组成新的数组返回

val a = Array(3,2,3,4)
//取得数组a中大于2的元素
val b = a.filter(x=>x>2)   //结果:Array(3, 3, 4)
//取得数组a中大于3的元素
val b = a.filter(x=>x>3)   //结果: Array(4)

30、filterNot
与上面的 filter 作用相反,取得当前数组中不符合条件的元素,组成新的数组返回

val a = Array(3,2,3,4)
//取得数组a中不符合大于4条件的元素(相当于输出数组a中小于等于4的元素)
val b = a.filterNot(x=>x>4)  //结果:Array(3, 2, 3, 4)
//取得数组a中不符合大于2条件的元素(相当于输出数组a中小于等于2的元素)
val b = a.filterNot(x=>x>2)  //结果: Array(2)

31、find
查找第一个符合条件的元素,存在则输出元素,反之则输出None

val a = Array(3,2,3,4)
//查找大于3的第一个元素
val b = a.find(x => x>3)  //结果:Option[Int] = Some(4)
//查找大于2的第一个元素
scala> val b = a.find(x => x>2)  //结果:Option[Int] = Some(3)
//查找大于5的第一个元素
scala> val b = a.find(x => x>5)  //结果: Option[Int] = None

32、flatMap
对当前序列的每个元素进行操作,结果放入新序列返回,参数要求是GenTraversableOnce及其子类

val a = Array(3,2,3,4)
//集合a的每个元素,分别从1开始,递增至该元素
a.flatMap(1 to _)  // 1,2,3,1,2,1,2,3,1,2,3,4

33、flatten
将二维数组的所有元素联合在一起,形成一个一维数组返回

//定义一个Int类型的二维数组
val darr = Array(Array(1,2,3),Array(4,5,6))
//联合二维数组的所有元素
darr.flatten  //结果:Array[Int] = Array(1, 2, 3, 4, 5, 6)
//定义一个String类型的二维数组
val darr = Array(Array("hello","java","scala"),Array("world","gree","kb09"))
darr.flatten   //结果:Array[String] = Array(hello, java, scala, world, gree, kb09)

34、fold
对序列中的每个元素进行二元运算,和aggregate有类似的语义,但执行过程有所不同

35、foldLeft

从左到右计算,简写方式:def /:[B](z: B)(op: (B, T) ⇒ B): B

def seqno(x:Int, y:Int):Int={
    println("seqno",x,y)
    x+y
}
val a = Array(1,2,3,4)
a.foldLeft(5)(seqno)

/**
(seqno,5,1)
(seqno,6,2)
(seqno,8,3)
(seqno,11,4)
res135: Int = 15
*/

//简写代码
(5 /: a)(_+_)   // 15

36、foldRight

从右到左计算,简写方式:def :[B](z: B)(op: (T, B) ⇒ B): B
def seqno(x:Int, y:Int):Int={
    println("seqno",x,y)
    x+y
}
val a = Array(1,2,3,4)
a.foldRight(5)(seqno)

/**
(seqno,4,5)
(seqno,3,9)
(seqno,2,12)
(seqno,1,14)
res137: Int = 15
*/

//简写代码
(a :\ 5)(_+_)   // 15

37、forall(p: (T) ⇒ Boolean): Boolean
检测序列中的元素是否都满足条件 p,如果序列为空,返回true

val a = Array(1,2,3,4)
//判断序列a中的元素是否都大于1
a.forAll(_>1)  // false
//判断序列a中的元素是否都大于0
a.forAll(_>0)  // true

38、foreachp: (T) ⇒ Boolean): Boolean
遍历检测序列中的元素是否都满足条件 p,如果序列为空,返回true

val a = Array(1,2,3,4)
//遍历序列a元素,分别判断该元素是否大于2
a.foreach(x => println(x>2)) 
/**
false
false
true
true
*/

39、foreach(f: (A) ⇒ Unit): Unit
遍历序列中的元素,进行 f 操作

val a = Array(1,2,3,4)
//遍历序列a元素,分别输出该元素*10的结果
a.foreach(x => println(x*10))
/**
10
20
30
40
*/

40、groupBy[K](f: (T) ⇒ K): Map[K, Array[T]]
按条件分组,条件由 f 匹配,返回值是Map类型,每个key对应一个序列

val a = Array(1,2,3,4)
//将序列a中的每个元素按其值分组
val b = a.groupBy(x => x)  //结果:Map(2 -> Array(2), 4 -> Array(4), 1 -> Array(1), 3 -> Array(3))

//把小于3的数字放到一组,大于3的放到一组,等于3的放到一组,返回Map[String,Array[Int]]
val b = a.groupBy(x => x match{
    case x if(x<3) => "small"
    case x if(x==3) => "equal"
    case _ => "big"
})

//结果:Map(small -> Array(1, 2), big -> Array(4), equal -> Array(3))

41、grouped(size: Int)
按指定数量分组,每组有 size 数量个元素,返回一个集合

val a = Array(1,2,3,4)
//将序列a按每组2个元素进行分组
a.grouped(2).toList  //结果:List(Array(1, 2), Array(3, 4))

//将序列a按每组2个元素进行分组,不足指定数量的也分出一组
val a = Array(1,2,3,4,5)
a.grouped(2).toList  //结果:List(Array(1, 2), Array(3, 4), Array(5))

42、hasDefiniteSize
检测序列是否存在有限的长度,对应Stream这样的流数据,返回false

val a = Array(1,2,3,4,5)
//检测序列a是否存在有限长度
a.hasDefiniteSize  // true

43、head

返回序列的第一个元素,如果序列为空,将引发错误

val a = Array(1,2,3,4,5)
//获取序列a的第一个元素
a.head  // 1

//等同于
a.apply(0)
val first=a(0)

44、headOption
返回Option类型对象,就是scala.Some 或者 None,如果序列是空,返回None

val a = Array(1,2,3,4,5)
a.headOption     // Option[Int] = Some(1)

val b:Array[Int] = Array()
b.headOption     // None

45、indexOf(elem: T)
返回elem在序列中的索引,找到第一个就返回其所在位置

val a = Array(1,2,3,4,5)
//返回元素2在序列a中的索引
a.indexOf(2)   // 1
//返回元素4在序列a中的索引
a.indexOf(4)   // 3

46、indexOf(elem: T, from: Int)
返回elem在序列中的索引,可以指定从某个索引处(from)开始查找,找到第一个就返回
如果要查找的不存在或者存在但没找到,则返回-1;找到则返回第一个的索引

val arr = Array("hello scala","hello python","hello spark","happy study","happy love")
//从索引为2的位置开始查找"hello scala"
arr.indexOf("hello scala",2)        // -1
//从索引为3的位置开始查找"hello love"
arr.indexOf("hello love",3)         // -1
//从索引为2的位置开始查找"happy love"
arr.indexOf("happy love",2)         // 4

47、indexOfSlice
检测当前序列中是否包含另一个序列,并返回第一个匹配出现的元素的索引;如果不包含则返回-1

val a = Array(1,2,3,4,5,6)
val d = Array(3,4,5)
a.indexOfSlice(d)   // Int = 2

val d = Array(3,5,4)
a.indexOfSlice(d)   // Int = -1

48、indexOfSlice[B >: A](that: GenSeq[B], from: Int)
检测当前序列中是否包含另一个序列(that),并返回第一个匹配出现的元素的索引,指定从 from 索引处开始
子序列要求:连续且相同
如果包含则返回匹配到的第一个元素的索引;匹配不到则返回-1

val a = Array(1,2,3,4,5,6)
val b = Array(3,4,5)        // Array(3, 4, 5)
a.indexOfSlice(b,1)         // Int = 2

val b = Array(3,5)
a.indexOfSlice(b,1)         // Int = -1

49、indexWhere(p: (T) ⇒ Boolean)
返回当前序列中第一个满足 p 条件的元素的索引

val a = Array(1,2,3,4,5,6)
a.indexWhere(x => x==3)       // Int = 2
a.indexWhere(x => x>3)        // Int = 3

50、indexWhere(p: (T) ⇒ Boolean, from: Int)
返回当前序列中第一个满足 p 条件的元素的索引,可以指定从 from 索引处开始

val a = Array(1,2,3,4,5,6)
a.indexWhere(x => x>3, 5)   // Int = 5
a.indexWhere(x => x>3, 4)   // Int = 4

51、indices
返回当前序列的索引集合

val a = Array(1,2,3,4,5,6)
a.indices     // 结果:scala.collection.immutable.Range = Range(0, 1, 2, 3, 4, 5)

52、init
返回当前序列中不包含最后一个元素的序列

val a = Array(1,2,3,4,5,6)
a.init     // Array(1, 2, 3, 4, 5)

53、inits
对集合中的元素进行 init 操作,该操作的返回值中, 第一个值是当前序列的副本,包含当前序列所有的元素,最后一个值是空的,对头尾之间的值进行init操作,上一步的结果作为下一步的操作对象

val a = Array(1,2,3,4,5,6)
a.inits.toList
// 结果:List(Array(1, 2, 3, 4, 5, 6), Array(1, 2, 3, 4, 5), Array(1, 2, 3, 4), Array(1, 2, 3), Array(1, 2), Array(1), Array())

54、intersect
取两个集合的交集

val a = Array(1,2,3,4,5)
val b = Array(2,4,6)
//取a、b两个集合的交集
a.intersect(b)       // Array(2, 4)

55、isDefinedAt(idx: Int)
判断序列中是否存在指定索引,存在则返回true,反之则返回false

val a = Array(1,2,3,4,5,6)
//判断序列a中是否存在索引3
a.isDefinedAt(3)          // Boolean = true
//判断序列a中是否存在索引10
a.isDefinedAt(10)         // Boolean = false

56、isEmpty
判断当前序列是否为空,为空则返回true,不为空则返回false

val a = Array(1,2,3,4,5,6)
a.isEmpty     // Boolean = false

val c:Array[Int] = Array()
c.isEmpty     // Boolean = true

57、isTraversableAgain
判断序列是否可以反复遍历,该方法是GenTraversableOnce中的方法,对于 Traversables 一般返回true,对于 Iterators 返回 false,除非被复写

58、iterator
对序列中的每个元素产生一个 iterator

val a = Array(1,2,3,4,5,6)
a.iterator.toList     // List(1, 2, 3, 4, 5, 6)
a.iterator.toArray    // Array(1, 2, 3, 4, 5, 6)

59、last
取得序列中最后一个元素

val a = Array(1,2,3,4,5,6)
a.last    // Int = 6

60、lastIndexOf(elem: T)
取得序列中最后一个等于 elem 的元素的位置

val a = Array(1,2,3,1,2,3,1,2)
a.lastIndexOf(2)     // Int = 7
a.lastIndexOf(3)     // Int = 5

61、lastIndexOf(elem: T, end: Int)
取得序列中最后一个等于 elem 的元素的位置,可以指定在 end 之前(包括)的元素中查找
如果存在则返回对应的索引,不存在则返回-1

val a = Array(1,2,3,1,2,3,1,2)
a.lastIndexOf(3,5)        // Int = 5
a.lastIndexOf(3,4)        // Int = 2

62、lastIndexOfSlice
判断当前序列中是否包含序列,并返回最后一次出现该序列的位置处的索引,如果不包含则返回-1

val a = Array(1,4,2,3,4,5,1,4)
val b = Array(1,4)
a.lastIndexOfSlice(b)     // Int = 6

63、lastIndexOfSlice[B >: A](that: GenSeq[B], end: Int)
判断当前序列中是否包含序列 that,并返回最后一次出现该序列的位置处的索引,可以指定在 end 之前(包括)的元素中查找

scala> val a = Array(1,4,2,3,4,5,1,4)
val b = Array(1,4)
a.lastIndexOfSlice(b,4)    // Int = 0

64、lastIndexWhere(p: (T) ⇒ Boolean): Int
返回当前序列中最后一个满足条件 p 的元素的索引

val a = Array(1,4,2,3,4,5,1,4)
a.lastIndexWhere(_<2)    // Int = 6
a.lastIndexWhere(_>3)    // Int = 7

65、lastIndexWhere(p: (T) ⇒ Boolean, end: Int)
返回当前序列中最后一个满足条件 p 的元素的索引,可以指定在 end 之前(包括)的元素中查找

val a = Array(1,4,2,3,4,5,1,4)
a.lastIndexWhere(_>3,6)      // Int = 5
a.lastIndexWhere(_<2,5)      // Int = 0

66、lastOption
返回当前序列中最后一个对象

val a = Array(1,2,3,4,5)
a.lastOption    // Option[Int] = Some(5)

67、length
返回当前序列中元素个数

val a = Array(1,2,3,4,5)
a.length     // Int = 5
//等同于:a.size

68、lengthCompare(len: Int)
比较序列的长度和参数 len,根据二者的关系返回不同的值
比较规则如下:
返回负数:len > 序列长度 (返回值为 len-序列长度)
返回正数:len < 序列长度
返回0:len = 序列长度

val a = Array(1,2,3,4,5,6)
a.lengthCompare(7)    // Int = -1
a.lengthCompare(5)    // Int = 1
a.lengthCompare(6)    // Int = 0
a.lengthCompare(9)    // Int = -3

69、map[B](f: (A) ⇒ B)
对序列中的元素进行 f 操作

val a = Array(1,2,3,4,5,6)
a.map({x:Int => x+10})      // Array(11, 12, 13, 14, 15, 16)

70、max
返回序列中最大的元素

val a = Array(1,2,3,4,5,6)
a.max     // Int = 6

71、maxBy
返回序列中第一个符合条件的最大的元素,如果没有符合条件的则输出整个序列的第一个元素

val a = Array(1,2,3,4,5,6)
a.maxBy(_>2)     // Int = 3
a.maxBy(_>7)     // Int = 1

72、mkString
mkString: String
将所有元素组合成一个字符串

val a = Array(1,2,3,4,5)
a.mkString     // String = 12345

mkString(sep: String): String
将所有元素组合成一个字符串,以 sep 作为元素间的分隔符

val a = Array(1,2,3,4,5)
a.mkString("&")    // String = 1&2&3&4&5

mkString(start: String, sep: String, end: String): String
将所有元素组合成一个字符串,以 start 开头,以 sep 作为元素间的分隔符,以 end 结尾

val a = Array(1,2,3,4,5)
a.mkString("{",",","}")     // String = {1,2,3,4,5}

73、nonEmpty
判断序列不是空,如果不为空则返回true,为空则返回false

val a = Array(1,2,3,4,5)
a.nonEmpty     // Boolean = true
val c:Array[Int] = Array()
c.nonEmpty     // Boolean = false

74、padTo(len: Int, elem: A)
后补齐序列,如果当前序列长度小于 len,那么新产生的序列长度是 len,多出的几个位值填充 elem,如果当前序列大于等于 len ,则返回当前序列

val a = Array(1,2,3,4,5) 
//需要一个长度为7的新序列,空出的填充 9
a.padTo(7,9)   // 结果: Array(1, 2, 3, 4, 5, 9, 9)

a.padTo(5,9)   // 结果:Array(1, 2, 3, 4, 5)
a.padTo(4,9)   // 结果:Array(1, 2, 3, 4, 5)

75、par
返回一个并行实现,产生的并行序列,不能被修改

val a = Array(1,2,3,4,5)
a.par     // 结果:ParArray(1, 2, 3, 4, 5)

76、partition
按条件将序列拆分成两个新的序列,满足条件的放到第一个序列中,其余的放到第二个序列

val a = Array(3,2,1)
a.partition(x => x%2==0)    // (Array(2),Array(3, 1))

a.partition(x => x%3==1)    // (Array(1),Array(3, 2))

77、patch(from: Int, that: GenSeq[A], replaced: Int)
批量替换,从原序列的 from 处开始,后面的 replaced 数量个元素,将被替换成序列 that

val a = Array(1,2,3,4,5,6,7,8)
val b = Array(11,12,13)
a.patch(3,b,1)       // Array(1, 2, 3, 11, 12, 13, 5, 6, 7, 8)

a.patch(3,b,2)       // Array(1, 2, 3, 11, 12, 13, 6, 7, 8)

a.patch(3,b,5)       // Array(1, 2, 3, 11, 12, 13)

78、permutations
排列组合,他与combinations不同的是,组合中的内容可以相同,但是顺序不能相同,combinations不允许包含的内容相同,即使顺序不一样

val a = Array(1,2,3)
a.permutations.toList
// 结果:List(Array(1, 2, 3), Array(1, 3, 2), Array(2, 1, 3), Array(2, 3, 1), Array(3, 1, 2), Array(3, 2, 1))

//对比combinations方法
val a = Array(1,2,3)
a.combinations(2).toList     // List(Array(1, 2), Array(1, 3), Array(2, 3))
a.combinations(3).toList     // List(Array(1, 2, 3))

79、prefixLength(p: (T) ⇒ Boolean)
给定一个条件 p,返回一个前置数列的长度,这个数列中的元素都满足 p

scala> val a = Array(1,2,3,4,5)
a.prefixLength(_>2)     // Int = 0
a.prefixLength(_<3)     // Int = 2

80、product
返回所有元素乘积的值

val a = Array(1,2,3,4,5)
a.product    // Int = 120 (1*2*3*4*5)

81、reduce
同 fold,不需要初始值

val a = Array(1,2,3,4,5)
a.reduce((x,y) => {println(x,y);x+y})
/**
(1,2)
(3,3)
(6,4)
(10,5)
Int = 15
*/

//对比fold方法
a.fold(5)((x,y) => {println(x,y);x+y})
/**
(5,1)
(6,2)
(8,3)
(11,4)
(15,5)
Int = 20
*/

82、reduceLeft
从左向右计算

val a = Array(1,2,3,4,5)
a.reduceLeft((x,y) => {println(x,y);x+y})
/**
(1,2)
(3,3)
(6,4)
(10,5)
Int = 15
*/

83、reduceRight
从右向左计算

val a = Array(1,2,3,4,5)
a.reduceRight((x,y) => {println(x,y);x+y})
/**
(4,5)
(3,9)
(2,12)
(1,14)
Int = 15
*/

84、reduceLeftOption
计算Option,参考reduceLeft

val a = Array(1,2,3,4,5)
a.reduceLeftOption((x,y) => {println(x,y);x+y})
/**
(1,2)
(3,3)
(6,4)
(10,5)
Option[Int] = Some(15)
*/

85、reduceRightOption
计算Option,参考reduceRight

val a = Array(1,2,3,4,5)
a.reduceRightOption((x,y) => {println(x,y);x+y})
/**
(4,5)
(3,9)
(2,12)
(1,14)
Option[Int] = Some(15)
*/

86、reverse
反转序列

val a = Array(1,2,3,4,5)
a.reverse     // Array(5, 4, 3, 2, 1)

87、reverseIterator
反向生成迭代

val a = Array(1,2,3,4,5)
a.reverseIterator.toList      // List(5, 4, 3, 2, 1)

88、reverseMap[B](f: (A) ⇒ B)
同 map,对序列中的元素进行 f 操作,但方向相反

val a = Array(1,2,3,4,5)
a.reverseMap({x:Int =>x*10} )      // Array(50, 40, 30, 20, 10)

89、sameElements
判断两个序列是否顺序和对应位置上的元素都一样,相同则返回true,不同则返回false

val a = Array(1,2,3,4,5)
val b = Array(1,2,3,4,5)
a.sameElements(b)    // Boolean = true

val c = Array(1,2,3,5,4)
a.sameElements(c)    // Boolean = false

90、scan
用法同 fold,scan会把每一步的计算结果放到一个新的集合中返回,而 fold 返回的是单一的值

val a = Array(1,2,3,4,5)
def seqno(x:Int,y:Int):Int={
    println("seqno",x,y)
    x+y
}
seqno: (x: Int, y: Int)Int
a.scan(5)(seqno)
/**
(seqno,5,1)
(seqno,6,2)
(seqno,8,3)
(seqno,11,4)
(seqno,15,5)
Array[Int] = Array(5, 6, 8, 11, 15, 20)
*/

91、scanLeft
从左向右计算

val a = Array(1,2,3,4,5)
a.scanLeft(5)(seqno)
/**
(seqno,5,1)
(seqno,6,2)
(seqno,8,3)
(seqno,11,4)
(seqno,15,5)
Array[Int] = Array(5, 6, 8, 11, 15, 20)
*/

92、scanRight
从右向左计算

scala> val a = Array(1,2,3,4,5)
a.scanRight(5)(seqno)
/**
(seqno,5,5)
(seqno,4,10)
(seqno,3,14)
(seqno,2,17)
(seqno,1,19)
Array[Int] = Array(20, 19, 17, 14, 10, 5)
*/

93、segmentLength(p: (T) ⇒ Boolean, from: Int)
从序列的 from 处开始向后查找,所有满足 p 的连续元素的长度

val a = Array(1,2,3,1,1,1,4,5)
a.segmentLength(_<3,3)     // Int = 3

94、seq
产生一个引用当前序列的 sequential 视图

val a = Array(1,2,3,4,5)
a.seq      // 结果:WrappedArray(1, 2, 3, 4, 5)

95、size
序列元素个数,同 length

val a = Array(1,2,3,4,5)
a.size    // Int = 5
//等同于:a.length 

96、slice(from:Int, until:Int)
取出当前序列中,索引为 from 到 until 之间的元素(左闭右开)

val a = Array(1,2,3,4,5)
a.slice(1,3)     // Array(2, 3)

97、sliding
sliding(size:Int)
从第一个元素开始,每个元素和它后面的 (size - 1) 个元素组成一个数组,最终组成一个新的集合返回,当剩余元素不够 size 数,则停止

val a = Array(1,2,3,4,5)
a.sliding(2).toList    // List(Array(1, 2), Array(2, 3), Array(3, 4), Array(4, 5))
a.sliding(3).toList    // List(Array(1, 2, 3), Array(2, 3, 4), Array(3, 4, 5))
a.sliding(4).toList    // List(Array(1, 2, 3, 4), Array(2, 3, 4, 5))
a.sliding(5).toList    // List(Array(1, 2, 3, 4, 5))

sliding(size:Int, step:Int)
从第一个元素开始,每个元素和它后面的 size - 1 个元素组成一个数组,最终组成一个新的集合返回,当剩余元素不够 size 数,则停止
该方法,可以设置步进 step,第一个元素组合完后,下一个从 (上一个元素位置+step)后的位置处的元素开始(滑动获取元素)

val a = Array(1,2,3,4,5,6,7,8,9,10,11,12,13)
//3个元素一集合,滑动位移为1
a.sliding(3,1).toList  
// 结果:List(Array(1, 2, 3), Array(2, 3, 4), Array(3, 4, 5), Array(4, 5, 6), Array(5, 6, 7), Array(6, 7, 8), Array(7, 8, 9), Array(8, 9, 10), Array(9, 10, 11), Array(10, 11, 12), Array(11, 12, 13))

//3个元素一集合,滑动位移为1
a.sliding(3,3).toList
// 结果:List(Array(1, 2, 3), Array(4, 5, 6), Array(7, 8, 9), Array(10, 11, 12), Array(13))

98、sortBy
按指定的排序规则排序,默认升序排序

val a = Array(1,2,3,4,5,6,7,8,9,10,11,12,13)
//降序排列
a.sortBy(x => {-1 * x})     // Array(13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
//定义元组
val arr = Array(("hello",4),("world",1),("scala",3),("java",6))
arr.sorted    // Array((hello,4), (java,6), (scala,3), (world,1))

//自定义排序规则
//按元组的第二个元素升序排序
arr.sortBy(x=>x._2)          // Array((world,1), (scala,3), (hello,4), (java,6))

//按元组的第二个元素降序排序
arr.sortBy(x=>{-1 * x._2})   // Array((java,6), (hello,4), (scala,3), (world,1))

99、sortWith
自定义排序规则

val a = Array(3,2,6,5,8,9,4)
//降序排列(大数在前)
a.sortWith(_.compareTo(_)>0)    // Array(9, 8, 6, 5, 4, 3, 2)

a.sortWith((x,y)=>{println(x,y);x.compareTo(y)>0})
/**
(2,3)
(3,2)
(6,2)
(6,2)
(6,3)
(5,3)
(5,6)
(6,5)
(8,3)
(8,5)
(8,6)
(9,5)
(9,6)
(9,8)
(4,5)
(5,4)
(4,2)
(4,3)
res19: Array[Int] = Array(9, 8, 6, 5, 4, 3, 2)
*/
val arr = Array(("hello",4),("world",1),("scala",3),("java",6))
//按元组第二个元素降序排列
arr.sortWith((x,y) => x._2>y._2)    // Array((java,6), (hello,4), (scala,3), (world,1))

//按元组第二个元素升序排列
arr.sortWith((x,y) => x._2<y._2)    // Array((world,1), (scala,3), (hello,4), (java,6))

100、sorted
使用默认的排序规则(升序)对序列排序

val a = Array(3,2,6,5,8,9,4)
a.sorted    // Array(2, 3, 4, 5, 6, 8, 9)

101、span
分割序列为两个集合
从第一个元素开始,直到找到第一个不满足条件的元素停止,之前的元素放到第一个集合,剩余的放到第二个集合

val a = Array(9,7,4,2,1,8)
a.span(x => x>4)     // (Array[Int], Array[Int]) = (Array(9, 7),Array(4, 2, 1, 8))

102、splitAt(n:Int)
从指定位置开始,把序列拆分成两个集合

val a = Array(9,7,4,2,1,8)
a.splitAt(3)      // (Array[Int], Array[Int]) = (Array(9, 7, 4),Array(2, 1, 8))

a.splitAt(1)      // (Array[Int], Array[Int]) = (Array(9),Array(7, 4, 2, 1, 8))

val arr = Array(("hello",4),("world",1),("scala",3),("java",6))
arr.splitAt(2)    
// (Array[(String, Int)], Array[(String, Int)]) = (Array((hello,4), (world,1)),Array((scala,3), (java,6)))

103、startsWith
startsWith[B](that: GenSeq[B]): Boolean
是否以某个序列开始

val a = Array(1,2,3,4,5,6,7,8)
val b = Array(4,5,6,7)
a.startsWith(b)        // Boolean = false

startsWith[B](that: GenSeq[B], offset: Int): Boolean
从指定偏移处,是否以某个序列开始

val a = Array(1,2,3,4,5,6,7,8)
val b = Array(4,5,6,7)
//数组a从索引为的3的位置开始,是否以数组b开始
a.startsWith(b,3)     // Boolean = true

a.startsWith(b,0)     // Boolean = false

val c = Array(4,5,6,7,1)
a.startsWith(c,3)     // Boolean = false

104、staringPrefix
返回 toString 结果的前缀
//定义数组类型

val a = Array(1,2,3,4,5,6,7,8)
a.stringPrefix      // String = [I

//定义集合类型
val l = List(1,2,3)
l.stringPrefix      // String = List

//定义元组类型
val arr = Array(("hello",4),("world",1),("scala",3),("java",6))
arr.stringPrefix    // String = Tuple2;

105、subSequence(start:Int, end:Int)
返回索引在 start 和 end 间的字符序列(左闭右开)

val chars = Array('a','b','c','d')
chars.subSequence(1,3)      // CharSequence = bc

106、sum
序列求和,元素需为Numeric[T]类型

val a = Array(1,2,3,4,5)
a.sum     // Int = 15

107、tail
返回除了当前序列第一个元素的其它元素组成的序列(去除序列第一个元素)

val a = Array(1,2,3,4,5,6,7,8)
a.tail       // Array(2, 3, 4, 5, 6, 7, 8)

val arr = Array(("hello",4),("world",1),("scala",3),("java",6))
arr.tail     // Array((world,1), (scala,3), (java,6))

108、take(n:Int)
返回当前序列中前 n 个元素组成的序列

val a = Array(1,2,3,4,5,6,7,8)
a.take(2)     // Array(1, 2)
a.take(3)     // Array(1, 2, 3)

109、takeRight(n: Int)
返回当前序列中,从右边开始,选择 n 个元素组成的序列

val a = Array(1,2,3,4,5,6,7,8)
a.takeRight(2)      // Array(7, 8)
a.takeRight(3)      // Array(6, 7, 8)

110、takeWhile
返回当前序列中,从第一个元素开始,满足条件的连续元素组成的序列

val a = Array(1,2,3,4,5,6,7,8)
a.takeWhile(x=>x>3)    // Array[Int] = Array()

a.takeWhile(x=>x<3)    // Array[Int] = Array(1, 2)

111、toArray
转换成 Array 类型

val a = List(1,2,3,4)
a.toArray     // Array(1, 2, 3, 4)

112、toBuffer
转换成 Buffer 类型

val a = Array(1,2,3,4)
a.toBuffer      // scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 2, 3, 4)

113、toIndexedSeq
转换成 IndexedSeq 类型

val a = Array(1,2,3,4)
a.toIndexedSeq     // scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3, 4)

114、toIterable
转换成可迭代的类型

scala> val a = Array(1,2,3,4)
a.toIterable       // Iterable[Int] = WrappedArray(1, 2, 3, 4)

115、toIterator
同 iterator 方法

val a = Array(1,2,3,4)
a.toIterator    // Iterator[Int] = non-empty iterator

116、toList
同 List 类型

val a = Array(1,2,3,4)
a.toList    // List[Int] = List(1, 2, 3, 4)

117、toMap
同 Map 类型,需要被转化序列中包含的元素是 元组类型数据

val arr = Array(("hello",4),("world",1),("scala",3),("java",6))
arr.toMap   // scala.collection.immutable.Map[String,Int] = Map(hello -> 4, world -> 1, scala -> 3, java -> 6)

118、toSeq
同 Seq 类型

val a = Array(1,2,3,4)
a.toSeq    // Seq[Int] = WrappedArray(1, 2, 3, 4)

119、toSet
同 Set 类型

val a = Array(1,2,3,4)
a.toSet     // scala.collection.immutable.Set[Int] = Set(1, 2, 3, 4)

120、toStream
同 Stream 类型

val a = Array(1,2,3,4)
a.toStream    // scala.collection.immutable.Stream[Int] = Stream(1, ?)

121、toVector
同 Vector 类型

val a = Array(1,2,3,4)
a.toVector     // Vector[Int] = Vector(1, 2, 3, 4)

122、transpose
矩阵转换,二维数组行列转换

val arr = Array(Array("a","b"),Array("c","d"),Array("e","f"),Array("g","h"))
arr.transpose     // Array(Array(a, c, e, g), Array(b, d, f, h))

123、transform
结构转换

val chars3 = Array(("a","b","c"),("d","e","f"),("g","h","i"))
chars3.transform(x=>(x._1+"1",x._2+"2",x._3+"3"))   // WrappedArray((a1,b2,c3), (d1,e2,f3), (g1,h2,i3))

124、unoin
联合两个序列,同操作符 ++

val a = Array(1,2,3,4,5,6,7,8)
val b = Array(3,4,5)
a.union(b)    // Array(1, 2, 3, 4, 5, 6, 7, 8, 3, 4, 5)

125、unzip
将含有两个元素的数组,第一个元素取出组成一个序列,第二个元素组成一个序列

val chars = Array(("a","b"),("c","d"),("e","f"),("g","h"))
chars.unzip    // (Array(a, c, e, g),Array(b, d, f, h))

126、unzip3
将含有三个元素的三个数组,第一个元素取出组成一个序列,第二个元素组成一个序列,第三个元素组成一个序列

val chars3 = Array(("a","b","c"),("d","e","f"),("g","h","i"))
chars3.unzip3    // (Array(a, d, g),Array(b, e, h),Array(c, f, i))

127、update(i: Int, x: T)
将序列中 i 索引处的元素更新为 x,在原数组上改变

val a = Array(1,2,3,4,5,6,7,8)
a.update(5,100)
a     // Array(1, 2, 3, 4, 5, 100, 7, 8)

128、updated(index: Int, elem: A)
将序列中 i 索引处的元素更新为 x ,并返回替换后的数组,原数组没变,生成新数组

val a = Array(1,2,3,4,5,6,7,8)
a.updated(5,100)     // Array(1, 2, 3, 4, 5, 100, 7, 8)

129、view(from: Int, until: Int)
返回索引在from 到 until 间的元素,不包括 until 处的元素(左闭右开)

val a = Array(1,2,3,4,5)
a.view(1,3).mkString(",")      // String = 2,3

130、withFilter
根据条件 p 过滤元素,与filter作用相同

val a = Array(1,2,3,4,5)
a.withFilter({x:Int => x>3}).map(x=>x)    // Array[Int] = Array(4, 5)

//等同于:a.filter(x=>x>3)    // Array[Int] = Array(4, 5)

131、zip
将两个序列对应位置上的元素组成一个pair序列

val a = Array(1,2,3,4,5)
val b= Array(6,7,8,9,10)
a.zip(b)     // Array((1,6), (2,7), (3,8), (4,9), (5,10))

val arr = Array(Array("a","b"), Array("c","d"), Array("e","f"), Array("g","h"))
arr.zip(b)   // Array((Array(a, b),6), (Array(c, d),7), (Array(e, f),8), (Array(g, h),9))

132、zipAll
同 zip ,但是允许两个序列长度不一样,不足的自动填充
如果当前序列短,空出的填充为 thisElem,如果 that 短,填充为 thatElem

val b= Array(6,7,8,9,10)
val arr = Array(Array("a","b"), Array("c","d"), Array("e","f"), Array("g","h"))
//以arr为主联合b,arr长度不足则填充4,b长度不足则填充5
arr.zipAll(b,4,5)    // Array((Array(a, b),6), (Array(c, d),7), (Array(e, f),8), (Array(g, h),9), (4,10))

//以b为主联合arr,b长度不足则填充4,arr长度不足则填充5
b.zipAll(arr,4,5)    // Array((6,Array(a, b)), (7,Array(c, d)), (8,Array(e, f)), (9,Array(g, h)), (10,5)) 

133、zipWithIndex
序列中的每个元素和它的索引组成一个序列

val arr1 = Array("dsj1","dsj2","dsj3","dsj4")
arr1.zipWithIndex        // Array((dsj1,0), (dsj2,1), (dsj3,2), (dsj4,3))

arr1.zipWithIndex.map(x=>(x._2,x._1))   // Array((0,dsj1), (1,dsj2), (2,dsj3), (3,dsj4))
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值