scala数组

目录

定长数组

变长数组

Array和ArrayBuffer相互转换

遍历数组

数组的常见方法


定长数组

定长数组的定义有种:

scala> val arr1 = Array[Int](1,2,3,4) //创建数组并设置具体内容
arr1: Array[Int] = Array(1, 2, 3, 4)

scala> var arr2 = new Array[Int](10) //创建一个元素类型为Int,元素个数为10的数组,初始化每个元素为0
arr2: Array[Int] = Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)

scala> var arr3 = Array[Int](10) //与arr2相比少了new关键字,查边就很大,此处一定要细心
arr3: Array[Int] = Array(10)

我们编译一段创建数组的scala代码看看,里面到底有啥?

//这是Demo.scala 
object Demo {  
    def main(args:Array[String]) {  
        val arr1 = Array[Int](10)
	var arr2 = new Array[Int](10)
	println(arr1)
	println(arr2)
    }  
}  

//这是Demo$.class
import scala.Array.;
import scala.Predef.;
import scala.reflect.ClassTag.;

public final class Demo$
{
  public static  MODULE$;

  static
  {
    new ();
  }

  public void main(String[] args)
  {
    //val arr1 = Array[Int](10)与new int[] { 10 }对应
    int[] arr1 = (int[])Array..MODULE$.apply(Predef..MODULE$.wrapIntArray(new int[] { 10 }), ClassTag..MODULE$.Int());
    //var arr2 = new Array[Int](10)与int[] arr2 = new int[10];对应
    int[] arr2 = new int[10];
    Predef..MODULE$.println(arr1);
    Predef..MODULE$.println(arr2);
  }
  private Demo$() { MODULE$ = this; }

}

//Demo.class这里就不贴出来了,没有什么重点

在编译后的Demo$.class中可以看到:

val arr1 = Array[Int](10)与new int[] { 10 }对应

var arr2 = new Array[Int](10)与int[] arr2 = new int[10];对应

scala的定长数组Array其实是用java的数组实现的。

变长数组

scala的变长数组是scala.collection.mutable.ArrayBuffer类,使用时必须先进行引用。

//引用scala.collection.mutable.ArrayBuffer类
scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer

//创建变长数组
scala> val arr1 = ArrayBuffer[Int]()
arr1: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()

上面提到scala的定长数组是用过java的数组实现的,当提到变长数组,可能很多人都会想到java中的List,然而scala中的ArrayBuffer并不是使用List实现的,看一下编译后的源码

val arr3 = ArrayBuffer[Int]()//这是我们创建的定长数组

ArrayBuffer arr3 = (ArrayBuffer)ArrayBuffer..MODULE$.apply(Nil..MODULE$);//编译后他张这样,执行了applay函数

变长数组的简单操作:

//引入ArrayBuffer
scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer

//创建元素类型为Int类型的可变数组
scala> val arr = ArrayBuffer[Int]()
arr: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()

//增加一个元素或一个元组Tuple
scala> arr += 1
res6: arr.type = ArrayBuffer(1)

scala> arr += (2,3)
res8: arr.type = ArrayBuffer(1, 2, 3)

//增加一个数组或集合
scala> arr ++= Array(4,5)
res9: arr.type = ArrayBuffer(1, 2, 3, 4, 5)

scala> arr ++= 6 to 8
res10: arr.type = ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8)

//从末尾删除两个元素
scala> arr.trimEnd(2)

scala> arr
res12: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5, 6)

//在下标为2之前插入数值1的元素
scala> arr.insert(2,1)

scala> arr
res14: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 1, 3, 4, 5,
 6)

//也可以插入多个元素
scala> arr.insert(2,1,2,3,4)

scala> arr
res16: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 1, 2, 3, 4,
 1, 3, 4, 5, 6)

//删除下标为2的元素,remove方法时有返回值的,返回的就是删除的那个元素的值
scala> arr.remove(2)
res17: Int = 1

scala> arr
res18: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 2, 3, 4, 1,
 3, 4, 5, 6)

//删除多个元素,第二个参数表示向后删除多少个元素,没有返回值
scala> arr.remove(2,3)

scala> arr
res20: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 1, 3, 4, 5,
 6)


Array和ArrayBuffer相互转换

//Array和ArrayBuffer互相转换
scala> val bufferToArray = arr.toArray
bufferToArray: Array[Int] = Array(1, 2, 4, 5, 6)

scala> val arrayToBuffer = bufferToArray.toBuffer
arrayToBuffer: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 2, 4, 5, 6)

遍历数组

scala> val arr = Array(0 to 10 : _*)
arr: Array[Int] = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> for(i <- 0 until arr.length) println(i)
0
1
2
3
4
5
6
7
8
9
10

回顾一下“_*”的意思,是把一个Range转成一个Seq,在方法中传入每一个元素

i <- 0 until arr.length,表示0到arr.length-1

遍历时可以设置两个一输出:

scala> val arr = Array(2,4,6,8,10)
arr: Array[Int] = Array(2, 4, 6, 8, 10)

//i <- 0 until (arr.length,2),表示隔一个赋值给i
scala> for(i <- 0 until (arr.length,2)) println(arr(i))
2
6
10

倒序遍历:

scala> val arr = Array(2,4,6,8,10)
arr: Array[Int] = Array(2, 4, 6, 8, 10)

scala> for(i <- (0 until arr.length).reverse) println(arr(i))
10
8
6
4
2

java中有增强for循环的操作,scala中也有,如果不需要使用元素下标,直接访问元素,就可以使用增强for循环操作

scala> val arr = Array(2,4,6,8,10)
arr: Array[Int] = Array(2, 4, 6, 8, 10)

scala> for(i <- arr) println(i)
2
4
6
8
10

数组的常见方法

废话不多说,直接上代码

scala> val arrStr = Array("a","bb","ccc","dddd")
arrStr: Array[String] = Array(a, bb, ccc, dddd)

scala> val arrInt = Array(3,2,4,1,5)
arrInt: Array[Int] = Array(3, 2, 4, 1, 5)

//求和
//泛型为字符串类型的数组不存在sum方法
scala> arrStr.sum
<console>:13: error: could not find implicit value for parameter num: Numeric[St
ring]
       arrStr.sum
              ^
//sum求和
scala> arrInt.sum
res13: Int = 15
//-----------------------------------------------------------------------------

//max和min,对于String类型的是比较字符串字符个数,数字类型的比较的是数值大小
scala> arrStr.max
res14: String = dddd

scala> arrInt.max
res15: Int = 5
//-----------------------------------------------------------------------------

//使用sortWith进行排序,可以自定义升序还是降序
//对于String类型的是比较字符串字符个数,数字类型的比较的是数值大小
scala> arrInt.sortWith(_>_)
res25: Array[Int] = Array(5, 4, 3, 2, 1)

scala> arrStr.sortWith(_>_)
res26: Array[String] = Array(dddd, ccc, bb, a)

//使用scala.util.Sorting.quickSort进行排序,但只能针对Array类型,不能针对ArrayBuffer
scala> scala.util.Sorting.quickSort(arrInt)

scala> arrInt
res28: Array[Int] = Array(1, 2, 3, 4, 5)

//ArrayBuffer不能使用scala.util.Sorting.quickSort
scala> val a = arrInt.toBuffer
a: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 2, 3, 4, 5)

scala> scala.util.Sorting.quickSort(a)
<console>:13: error: overloaded method value quickSort with alternatives:
  [K](a: Array[K])(implicit evidence$1: scala.math.Ordering[K])Unit <and>
  (a: Array[Float])Unit <and>
  (a: Array[Int])Unit <and>
//-----------------------------------------------------------------------------

//mkString,获取数组中的内容,并使用分隔符和前缀后缀
scala> arrInt
res35: Array[Int] = Array(1, 2, 3, 4, 5)

scala> arrInt.mkString
res36: String = 12345
scala> arrInt.mkString(",")
res37: String = 1,2,3,4,5

scala> arrInt.mkString("<",",",">")
res38: String = <1,2,3,4,5>
//-----------------------------------------------------------------------------

//toString就是调用的java中toString方法
scala> arrInt.toString
res39: String = [I@7c609e43//数组使用toString方法就是打印的这个鸟玩意(类型@哈希值)

//ArrayBuffer使用toString方法就能显示类型和内容
scala> arrInt.toBuffer.toString
res41: String = ArrayBuffer(1, 2, 3, 4, 5)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值