Scala Array常用方法(二)

Scala Array常用方法(二)

我们在上一篇博客Scala Array常用方法(一)中已经介绍了很多Scala中Array的常见的方法,下面我们就将Array的方法给大家介绍完。

indexOf

  • def indexOf(elem: T): Int
    • 返回elem在序列中的索引,找到第一个就返回
  • def indexOf(elem: T, from: Int): Int
    • 返回elem在序列中的索引,可以指定从某个索引处(from)开始查找,找到第一个就返回
val a = Array(1,3,2,3,4)
println(a.indexOf(3))			// 1
println(a.indexOf(3,2))		    // 3

indexOfSlice

  • def indexOfSlice[B >: A](that: GenSeq[B]): Int
    • 检测当前序列中是否包含另一个序列(that),并返回第一个匹配出现的元素的索引
  • def indexOfSlice[B >: A](that: GenSeq[B], from: Int): Int
    • 检测当前序列中是否包含另一个序列(that),并返回第一个匹配出现的元素的索引,指定从 from 索引处开始
    val a = Array(1, 3, 2, 3, 2, 3, 4)
    val b = Array(2,3)
    println(a.indexOfSlice(b))		// return 2
    println(a.indexOfSlice(b,3))    // return 4

indexWhere

  • def indexWhere(p: (T) ⇒ Boolean): Int
    • 返回当前序列中第一个满足 p 条件的元素的索引
  • def indexWhere(p: (T) ⇒ Boolean, from: Int): Int
    • 返回当前序列中第一个满足 p 条件的元素的索引,可以指定从 from 索引处开始
    val a = Array(1, 2, 3, 4, 5, 6)
    println(a.indexWhere( {x:Int => x>3}))  	// return 3
    println(a.indexWhere( {x:Int => x>3},4))    // return 4

indices

  • def indices: collection.immutable.Range
    • 返回当前序列索引集合
	val a = Array(1,2,3,3,1,2,3)
	val b = a.indies
	println(b.mkString(","))		//0,1,2,3,4,5,6

init

  • def init: Array[T]
    • 返回当前序列中不包含最后一个元素的序列
	val a = Array(1,2,3,3,1,2,3)
	val b = a.init
	println(b.mkString)		//1,2,3,3,1,2

inits

  • def inits: collection.Iterator[Array[T]]
    • 对集合中的元素进行 init 操作,该操作的返回值中, 第一个值是当前序列的副本,包含当前序列所有的元素,最后一个值是空的,对头尾之间的值进行init操作,上一步的结果作为下一步的操作对象
val a = Array(1,2,3,4,5)
val b = a.inits.toList
//b: List[Array[Int]] = List(Array(1, 2, 3, 4, 5), Array(1, 2, 3, 4), Array(1, 2, 3), Array(1, 2), Array(1), Array())

intersect

  • 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)
    println(c.mkString(","))    //return 3,4

isDefinedAt

  • def isDefinedAt(idx: Int): Boolean
    • 判断序列中是否存在指定索引
    val a = Array(1, 2, 3, 4, 5)
    println(a.isDefinedAt(1))   // true
    println(a.isDefinedAt(10))  // false

isEmpty

  • def isEmpty: Boolean
    • 判断当前序列是否为空
val a = Array(1,2,3)
a.isEmpty					//false
val b:Array[Int] = Array()
b.isEmpty					//true

isTraversableAgain

  • def isTraversableAgain: Boolean
    • 判断序列是否可以反复遍历,该方法是GenTraversableOnce中的方法,对于 Traversables 一般返回true,对于 Iterators 返回 false,除非被复写
val a = Array(1,2,3)
a.isTraversableAgain				//true
a.toIterator.isTraversableAgain		//false

iterator

  • def iterator: collection.Iterator[T]
    • 对序列中的每个元素产生一个 iterator
val a = Array(1,2,3,4)
a.iterator.toList		//List(1, 2, 3, 4, 5)

last

  • def last: T
    • 取得序列中最后一个元素
val a = Array(1,2,3,4)
a.last				//4

lastIndexOf

  • def lastIndexOf(elem: T): Int
    • 取得序列中最后一个等于 elem 的元素的位置
  • def lastIndexOf(elem: T, end: Int): Int
    • 取得序列中最后一个等于 elem 的元素的位置,可以指定在 end 之前(包括)的元素中查找
val a =Array(1,2,3,4,5,2)
a.lastIndexOf(2)		//5
a.lastIndexOf(2,3)		//1

lastIndexOfSlice

  • def lastIndexOfSlice[B >: A](that: GenSeq[B]): Int
    • 判断当前序列中是否包含序列 that,并返回最后一次出现该序列的位置处的索引
  • def lastIndexOfSlice[B >: A](that: GenSeq[B], end: Int): Int
    • 判断当前序列中是否包含序列 that,并返回最后一次出现该序列的位置处的索引,可以指定在 end 之前(包括)的元素中查找
    val a = Array(1, 4, 2, 3, 4, 5, 1, 4)
    val b = Array(1, 4)
    a.lastIndexOfSlice(b)		//6
    a.lastIndexOfSlice(b,4)		//0

lastIndexWhere

  • def lastIndexWhere(p: (T) ⇒ Boolean): Int
    • 返回当前序列中最后一个满足条件 p 的元素的索引
  • def lastIndexWhere(p: (T) ⇒ Boolean, end: Int): Int
    • 返回当前序列中最后一个满足条件 p 的元素的索引,可以指定在 end 之前(包括)的元素中查找
    val a = Array(1, 4, 2, 3, 4, 5, 1, 4)
    val b = Array(1, 4)
    a.lastIndexWhere( {x:Int => x<2})	 	//6
    a.lastIndexWhere( {x:Int => x<2},2)		//0

lastOption

  • def lastOption: Option[T]
    • 返回当前序列中最后一个对象
val a = Array(1,2,3,4,5)
a.lastOption			//some(5)

length

  • def length: Int
    • 返回当前序列中元素个数
val a = Array(1,2,3,4,5)
a.length			//5

lenghtCompare

  • def lengthCompare(len: Int): Int
    • 比较序列的长度和参数 len,返回序列长度和参数len的差值
val a = Array(1,2,3,4,5)
a.lengthCompare(9)		//-4
a.lengthCompare(5)		//0
a.lengthCompare(3)		//2

map

  • def map[B](f: (A) ⇒ B): Array[B]
    • 对序列中的元素进行 f 操作
val a = Array(1,2,3,4,5)
a.map(x=>x*10)			//10,20,30,40,50

max

  • def max: A
    • 返回序列中最大的元素
val a = Array(1,2,3,4,5)
a.max			//5

maxBy

  • def maxBy[B](f: (A) ⇒ B): A
    • 返回序列中第一个满足条件的元素,若是都不满足,则返回数组的第一个元素
val  a = Array(1,2,3,4,5)
a.maxBy(x=>x>2)			//3
a.maxBy(x=>x>50)		//1	数组都不满足,返回第一个元素1

下面的是maxBy的源码。
maxBy源码

min

  • def min: A
    • 返回序列中最小的元素
val a = Array(6,2,4,5,1,3,7)
a.min		//1

minBy

  • def minBy[B](f: (A) ⇒ B): A
    • 返回序列中第一个不满足条件的元素,若是都满足或是都不满足,则返回数组的第一个元素
val a = Array(6,2,4,5,1,3,7)
a.minBy(x=>x>3)			//2
a.minBy(x=>x<0)			//6

mkString

  • def mkString: String
  • def mkString(sep: String): String
    • 将所有元素组合成一个字符串,以 sep 作为元素间的分隔符
val a = Array(1, 2, 3, 4, 5)
println(a.mkString("_"))    // return  1_2_3_4_5

nonEmpty

  • def nonEmpty: Boolean
    • 判断序列不是空
val a = Array(1,2,3)
a.isEmpty					//true
val b:Array[Int] = Array()
b.isEmpty					//false

padTo

  • def padTo(len: Int, elem: A): Array[A]
    • 后补齐序列,如果当前序列长度小于 len,那么新产生的序列长度是 len,多出的几个位值填充 elem,如果当前序列大于等于 len ,则返回当前序列
val a = Array(1,2,3,4)
a.padTo(6,100)		//新序列长度为6,不足的地方用100补充,即1,2,3,4,100,100

par

  • def par: ParArray[T]
    • 返回一个并行实现,产生的并行序列,不能被修改
    • 可以理解为多线程
val a = Array(1, 2, 3, 4, 5)
val b = a.par   //  "ParArray" size = 5

partition

  • def partition(p: (T) ⇒ Boolean): (Array[T], Array[T])
    • 按条件将序列拆分成两个新的序列,满足条件的放到第一个序列中,其余的放到第二个序列,下面以序列元素是否是 2 的倍数来拆分
val a = Array(1, 2, 3, 4, 5)
val b:(Array[Int],Array[Int]) = a.partition( {x:Int => x % 2 == 0})
b._1.mkString(",")     //2,4
b._2.mkString(",")     //1,3,5

patch

  • def patch(from: Int, that: GenSeq[A], replaced: Int): Array[A]
    • 批量替换,从原序列的 from 处开始,后面的 replaced 数量个元素,将被替换成序列 that
val a = Array(1,2,3,4,5,6,7,8)
val b = Array(100,200,300)
a.patch(3,b,2)		//1, 2, 3, 100, 200, 300, 6, 7, 8
//序列a下标为3的元素开始,一共2个元素,被替换成b的内容

permutations

  • def permutations: collection.Iterator[Array[T]]
    • 排列组合,他与combinations不同的是,组合中的内容可以相同,但是顺序不能相同,combinations不允许包含的内容相同,即使顺序不一样
val a = Array(1, 2, 3, 4, 5)
val b = a.permutations.toList   
// b 中将有120个结果,知道排列组合公式的,应该不难理解吧
/**如果是combinations*/
val b = a.combinations(5).toList    
// b 中只有一个,因为不管怎样排列,都是这5个数字组成,所以只能保留第一个

prefixLength

  • def prefixLength(p: (T) ⇒ Boolean): Int
    • 给定一个条件 p,返回一个前置数列的长度,这个数列中的元素都满足 p
val a = Array(1,2,3,4,1,2,3,4)
val b = a.prefixLength( {x:Int => x<3}) // b = 2

product

  • def product: A
    • 返回所有元素乘积的值
val a = Array(1,2,3,4,5)
val b = a.product       // b = 120  (1*2*3*4*5)

reduce

  • def reduce[A1 >: A](op: (A1, A1) ⇒ A1): A1
    • 同 fold,不需要初始值
val a = Array(1,2,3,4,5)
a.reduce((x,y)=>{ println(x,y);x+y })		//15
  /**
  1,2
  3,3
  6,4
  10,5
  */

reduceLeft

  • -def reduceLeft[B >: A](op: (B, T) ⇒ B): B
    • 从左向右计算

reduceRight

  • def reduceRight[B >: A](op: (T, B) ⇒ B): B
    • 从右向左计算

reduceLeftOption

  • def reduceLeftOption[B >: A](op: (B, T) ⇒ B): Option[B]
    • 计算Option,参考reduceLeft

reduceRightOption

  • def reduceRightOption[B >: A](op: (T, B) ⇒ B): Option[B]
    • 计算Option,参考reduceRight

reverse

  • def reverse:Array[T]
    • 反转序列
val a = Array(1,2,3,4,5)
a.reverse		//5,4,3,2,1

reverseIterator

  • def reverseIterator: collection.Iterator[T]
    • 反向生成迭代

reverseMap

  • def reverseMap[B](f: (A) ⇒ B): Array[B]
    • 同 map 方向相反
val a = Array(1,2,3,4,5)
a.reverseMap( {x:Int => x*10} )		// 50,40,30,20,10

sameElements

  • def sameElements(that: GenIterable[A]): Boolean
    • 判断两个序列是否顺序和对应位置上的元素都一样
val a = Array(1,2,3,4,5)
val b = Array(1,2,3,4,5)
println(a.sameElements(b))  // true
 
val c = Array(1,2,3,5,4)
println(a.sameElements(c))  // false

scan

  • def scan[B >: A, That](z: B)(op: (B, B) ⇒ B)(implicit cbf: CanBuildFrom[Array[T], B, That]): That
    • 用法同 fold,scan会把每一步的计算结果放到一个新的集合中返回,而 fold 返回的是单一的值
  def seqop(m:Int,n:Int): Int ={
	println("seqop,"+m+","+n)
  }
    val a = Array(1, 2, 3,4)
    val b = a.scan(5)(seqop)
    /** 运算过程
    seqop,5,1
	seqop,6,2
	seqop,8,3
	seqop,11,4
	最终结果为	5,6,8,11,15
    */

scanLeft

  • def scanLeft[B, That](z: B)(op: (B, T) ⇒ B)(implicit bf:CanBuildFrom[Array[T], B, That]):
    • That 从左向右计算,同scan

scanRight

  • def scanRight[B, That](z: B)(op: (T, B) ⇒ B)(implicit bf:CanBuildFrom[Array[T], B, That]): That
    • 从右向左计算

segmentLength

  • def segmentLength(p: (T) ⇒ Boolean, from: Int): Int
    • 从序列的 from处开始向后查找,所有满足 p 的连续元素的长度
val a = Array(1,2,3,1,1,1,1,1,4,5)
a.segmentLength( {x:Int => x < 3},3)        // 5

size

  • def size: Int
    • 序列元素个数,同 length
val a = Array(1,2,3,4,5)
a.size			//5

slice

  • def slice(from: Int, until: Int): Array[T]
    • 取出当前序列中,from 到 until 之间的片段
val a = Array(1,2,3,4,5,6)
a.slice(2,5)		//3,4,5

sliding

  • def sliding(size: Int): collection.Iterator[Array[T]]
    • 从第一个元素开始,每个元素和它后面的 size - 1 个元素组成一个数组,最终组成一个新的集合返回,当剩余元素不够 size 数,则停止
  • def sliding(size: Int, step: Int): collection.Iterator[Array[T]]
    • 从第一个元素开始,每个元素和它后面的 size - 1 个元素组成一个数组,最终组成一个新的集合返回,当剩余元素不够 size 数,则停止
      该方法,可以设置步进 step,第一个元素组合完后,下一个从 上一个元素位置+step后的位置处的元素开始
val a = Array(1,2,3,4,5,6,7,8,9)
a.sliding(3).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))
a.sliding(3,2).toList	//List[Array[Int]] = List(Array(1, 2, 3), Array(3, 4, 5), Array(5, 6, 7), Array(7, 8, 9))

sortBy

  • def sortBy[B](f: (T) ⇒ B)(implicit ord: math.Ordering[B]): Array[T]
    • 按指定的排序规则排序
    • 默认升序,降序加’-'号
val a = Array(3,2,6,4,1,8,5,4)
a.sortBy(x=>x)			//1,2,3,4,4,5,6,8
a.sortBy(x=>{-x})		//8,6,5,4,4,3,2,1

sortWith

  • def sortWith(lt: (T, T) ⇒ Boolean): Array[T]
    • 自定义排序方法 lt
val a = Array(3,2,6,4,1,8,5,4)
a.sortWith((x,y)=>{println(x,y);x.compareTo(y)>0})
/**
(2,3)
(3,2)
(6,2)
(6,2)
(6,3)
(4,3)
(4,6)
(6,4)
(1,3)
(3,1)
(1,2)
(2,1)
(8,3)
(8,4)
(8,6)
(5,3)
(5,6)
(6,5)
(5,4)
(4,4)
(4,4)
(4,2)
(4,3)
res15: Array[Int] = Array(8, 6, 5, 4, 4, 3, 2, 1)
*/

sorted

  • def sorted[B >: A](implicit ord: math.Ordering[B]): Array[T]
    • 使用默认的排序规则对序列排序,升序
val a = Array(3,2,6,4,1,8,5,4)
a.sorted		//1, 2, 3, 4, 4, 5, 6, 8

span

  • def span(p: (T) ⇒ Boolean): (Array[T], Array[T])
    • 分割序列为两个集合,从第一个元素开始,直到找到第一个不满足条件的元素止,之前的元素放到第一个集合,其它的放到第二个集合
val a = Array(9,7,4,2,1,8)
a.span(_>4)			//Array(9, 7),Array(4, 2, 1, 8)

splitAt

  • def splitAt(n: Int): (Array[T], Array[T])
    • 从指定位置开始,把序列拆分成两个集合
val a = Array(9,7,4,2,1,8)
a.splitAt(3)			//Array(9, 7, 4),Array(2, 1, 8)

startsWith

  • def startsWith[B](that: GenSeq[B]): Boolean
    • 是否以某个序列开始
  • def 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.startsWith(b)			//false
a.startsWith(b,3)		//true

stringPrefix

  • def stringPrefix: String
    • 返回 toString 结果的前缀
val a = Array(0,1,2,3,4,5)
println(a.toString())       //[I@3daa57fb
val b = a.stringPrefix
println(b)      //[I

subSequence

  • def subSequence(start: Int, end: Int): CharSequence
    • 返回 start 和 end 间的字符序列
val chars = Array('a','b','c')
chars.subSequence(1,2)			//b

sum

  • def sum: A
    • 序列求和,元素需为Numeric[T]类型
val a = Array(1,2,3,4,5,6,7,8)
a.sum			//36

take

  • def take(n: Int): Array[T]
    • 返回当前序列中前 n 个元素组成的序列
val a = Array(1,2,3,4,5)
val b = a.take(3)       //  1,2,3

takeRight

  • def takeRight(n: Int): Array[T]
    • 返回当前序列中,从右边开始,选择 n 个元素组成的序列
val a = Array(1,2,3,4,5)
val b = a.takeRight(3)      //  3,4,5

takeWhile

  • def takeWhile(p: (T) ⇒ Boolean): Array[T]
    • 返回当前序列中,从第一个元素开始,满足条件的连续元素组成的序列
val a = Array(1,2,3,4,5,6,4,3,2,1)
a.takeWhile(x=>x<5)		//1, 2, 3, 4

toArray

  • def toArray: Array[A]
    • 转换成 Array 类型

toBuffer

  • def toBuffer[A1 >: A]: Buffer[A1]
    • 转换成 Buffer 类型

toIndexedSeq

  • def toIndexedSeq: collection.immutable.IndexedSeq[T]
    • 转换成 IndexedSeq类型

toInterable

  • def toIterable: collection.Iterable[T]
    • 转换成可迭代的类型

toIterator

  • def toIterator: collection.Iterator[T]
    • 同 iterator 方法

toList

  • def toList: List[T]
    • 同 List 类型

toMap

  • def toMap[T, U]: Map[T, U]
    • 同 Map 类型,需要被转化序列中包含的元素时 Tuple2 类型数据

toSeq

  • def toSeq: collection.Seq[T]
    • 同 Seq 类型

toSet

  • def toSet[B >: A]: Set[B]
    • 同 Set 类型

toStream

  • def toStream: collection.immutable.Stream[T]
    • 同 Stream 类型

toVector

  • def toVector: Vector[T]
    • 同 Vector 类型

transpose

  • def transpose[U](implicit asArray: (T) ⇒ Array[U]): Array[Array[U]]
    • 矩阵转换,二维数组行列转换
val arr = Array(Array("a","b"),Array("c","d"),Array("e","f"),Array("g","h"))
arr.transpose			//Array(a, c, e, g), Array(b, d, f, h)

union

  • def union(that: collection.Seq[T]): Array[T]
    • 联合两个序列,同操作符 ++
val a = Array(1,2,3,4,5)
val b = Array(6,7)
a.union(b)			 // 1,2,3,4,5,6,7

unzip

  • def unzip[T1, T2](implicit asPair: (T) ⇒ (T1, T2), ct1: ClassTag[T1], ct2: ClassTag[T2]): (Array[T1], Array[T2])
    • 将含有两个元素的数组,第一个元素取出组成一个序列,第二个元素组成一个序列
val chars = Array(("a","b"),("c","d"))
chars.unzip			//Array(a, c),Array(b, d)

unzip3

  • def unzip3[T1, T2, T3](implicit asTriple: (T) ⇒ (T1, T2, T3), ct1: ClassTag[T1], ct2: ClassTag[T2], ct3: ClassTag[T3]): (Array[T1], Array[T2], Array[T3])
    • 将含有三个元素的三个数组,第一个元素取出组成一个序列,第二个元素组成一个序列,第三个元素组成一个序列
val chars3 = Array(("a","b",1),("c","d",2),("e","f",3))
chars3.unzip3			//Array(a, c, e),Array(b, d, f),Array(1, 2, 3)

update

  • def update(i: Int, x: T): Unit
    • 将序列中 i 索引处的元素更新为 x
val a = Array(1,2,3,4,5,6,7,8)
a.update(5,100)			//1, 2, 3, 4, 5, 100, 7, 8

view

  • def view(from: Int, until: Int): IndexedSeqView[T, Array[T]]
    • 返回 from 到 until 间的序列,不包括 until 处的元素
val a = Array(1,2,3,4,5,6,7,8)
a.view(0,3).toList			//1, 2, 3

withFilter

  • def withFilter(p: (T) ⇒ Boolean): FilterMonadic[T, Array[T]]
    • 根据条件 p 过滤元素
val a = Array(1,2,3,4,5,6,7,8)
a.withFilter(x=>x>5).map(x=>x)			//6, 7, 8

zip

  • def zip[B](that: GenIterable[B]): Array[(A, B)]
    • 将两个序列对应位置上的元素组成一个pair序列
val a = Array(1,2,3,4,5)
val b = Array(6,7,8,9,10)
a.zip(b)			//(1,6), (2,7), (3,8), (4,9), (5,10)

zipAll

  • def zipAll[B](that: collection.Iterable[B], thisElem: A, thatElem: B): Array[(A, B)]
    • 同 zip ,但是允许两个序列长度不一样,不足的自动填充,如果当前序列端,空出的填充为 thisElem,如果 that 短,填充为 thatElem
    • 补充的规则可以理解为,左边短用左边补,右边短用右边补
val b = Array(6,7,8,9,10)
val c = Array(1,2)
c.zipAll(b,100,200)			//(1,6), (2,7), (100,8), (100,9), (100,10)
b.zipAll(c,100,200)			//(6,1), (7,2), (8,200), (9,200), (10,200)

zipWithIndex

  • def zipWithIndex: Array[(A, Int)]
    • 序列中的每个元素和它的索引组成一个序列
val a = Array(10,20,30,40)
a.zipWithIndex		//(10,0),(20,1),(30,2),(40,3)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值