scala数组操作

2019-03-23 21:27|来源: 网路

定长数组

最简单的数组创建如下,记住方括号在Scala中用做泛型,相当于<>在Java中作用。

定义10个Integer的数组,初始值为零。

val nums = new Array[Int](10)


定义数组的时候,可以省略new的初始化,并且利用类型推断,无需指明类型

val s = Array("Hello", "World")


获取数组中的元素使用(数组下标)。

s(0) = "Goodbye"

s不是val吗?为什么可以改变呢?s这里存的是一个数组的reference,reference不能变,但是其内容是可以改变的。另外说一句,遗憾的是,从C时代开始,Index从0开始这一违反人类正常思维的“习惯”一直沿用。


可以通过下面这种方式连接两个定长数组创建一个新的数组
  scala> val array = Array(1, 4, 2, 3)
  array: Array[Int] = Array(1, 4, 2, 3)
  scala> val combine =array ++ Array(1, 2)

 combine: Array[Int] = Array(1, 4, 2, 3, 1, 2)

变长数组

Scala中的ArrayBuffer和Java中的ArrayList类似,长度可以改变。

在使用ArrayBuffer的时候,要引入它。scala中引入包的方式为

import scala.collection.mutable.ArrayBuffer

val b = ArrayBuffer[Int]();
b += 1 //加元素
b += (1, 2, 3, 5) //加数组
b ++= Array(6,7)//加集合
println(b)


数组遍历

可以使用Index

for (i <- 0 until a.length)println(i + ": " + a(i))

或者

for (elem <- a) println(elem)

要强调的是,对一个数组(或者其他集合)进行遍历以一种命令式的编程(imperative programming)。在Scala中,我们往往避免使用,而是使用函数式的方法。强调“做什么”而不是怎么做。以后还会遇到很多例子,你会逐步感受到它们的区别。

b.foreach(x => println(x))


通用算法

Scala提供了很多内建通用算法,作用于数组,以及以后会谈到的其他数据类型如集合。比如sum,count,max,mKString等等。mKString是一个很使用的方法。参见下面的例子。

  scala> Array(1, 2, 3).sum  
  res0: Int = 6  
scala> ArrayBuffer(1, 2, 3).max  
res2: Int = 3  
scala> ArrayBuffer(1, 2, 3).max  
res2: Int = 3  
scala> val a = Array(1, 10, 2, 9)  
a: Array[Int] = Array(1, 10, 2, 9)  
scala> scala.util.Sorting.quickSort(a)//对数组进行排序  
scala> a.mkString(" and ")  
res4: String = 1 and 2 and 9 and 10  


整理于网络


相关问答

更多
  • 如何统计数组中每个元素重复次数 PHP 中的 array_count_values() 函数可以实现 array_count_values() 函数用于统计数组中所有值出现的次数。 本函数返回一个数组,其元素的键名是原数组的值,键值是该值在原数组中出现的次数。
  • scala> val arr = Array("Hello","World") arr: Array[java.lang.String] = Array(Hello, World) scala> val arr = Array("Hello","World") arr: Array[java.lang.String] = Array(Hello, World)
  • 可能这就是你需要的: val tmp = arr_one map ((arr1) => {arr_two map (arr2 => (arr1 zip arr2) map {case(a, b) => a * b} reduce (_ + _))} ) 要获得ArrayBuffer只需使用: tmpArr = tmp.toBuffer May be this is what you need: val tmp = arr_one map ((arr1) => {arr_two map (arr2 => ...
  • 我想你错过了回归类型: override def accept(o: GameObject) = {...} 要么 override def accept(o: GameObject): Boolean = {...} 这两个变体是相同的(假设您实际上在此方法的主体中返回一些布尔值)。 如果你定义这样的accept方法: override def accept(o: GameObject) {...} 然后它是一样的: override def accept(o: GameObject): Unit ...
  • 使用微风 Vector : scala> val arr = Array(Array(1, 100), Array(2, 200), Array(3, 300)) arr: Array[Array[Int]] = Array(Array(1, 100), Array(2, 200), Array(3, 300)) scala> arr.map(breeze.linalg.Vector(_)).reduce(_ + _) res0: breeze.linalg.Vector[Int] = DenseVec ...
  • 用2.7,你应该可以 Tree[] t = (Tree)ScalaObject.myScalaFunction().unbox(Tree.class); 在Java中。 有了2.8,它会像你希望的那样工作。 With 2.7, you should be able to Tree[] t = (Tree)ScalaObject.myScalaFunction().unbox(Tree.class); in Java. With 2.8, it will work as you hoped it woul ...
  • 您可以在任何类上使用此语法进行模式匹配,只要您具有带有unapplySeq或unapplySeq (在varargs的情况下)方法的对象,该方法返回Option或Boolean 。 这些被称为提取器 。 来自对象Array有问题的行是 def unapplySeq[T](x: Array[T]): Option[IndexedSeq[T]] = if (x == null) None else Some(x.toIndexedSeq) 在您的示例中,您可以使用它来匹配它 class A(va ...
  • cube的类型为BigInt。 所以Array(cube)的类型是Array [BigInt] master(perm)的类型是Array [Int],您正在尝试这样做 Array[Int] :+ BigInt => Array[Int], which does not work. 建议:创建BigInt类型的所有数组。 所以: var m = new scala.collection.mutable.LinkedHashMap[String,Array[BigInt]] var master = m.w ...
  • 只要您的数组具有相同的长度,就可以使用zip和map来完成 定义数组 scala> Array("1", "2", "3") res0: Array[String] = Array(1, 2, 3) scala> Array("orange", "Apple", "Grape") res1: Array[String] = Array(orange, Apple, Grape) scala> Array("Milk", "juice", "cream") res2: Array[String] = Ar ...
  • 试试这个: val s = readLine val a: Array[Int] = s.split(" ").map(_.toInt) 或val a = readLine.split(" ").map(_.toInt) ;) Try this: val s = readLine val a: Array[Int] = s.split(" ").map(_.toInt) or val a = readLine.split(" ").map(_.toInt) ;)