English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

ال

Scala 语言中提供的数组是用来存储固定大小的同类型元素,数组对于每一门编辑应语言来说都是重要的数据结构之一。

声明数组变量并不是声明 number0、number1、...、number99 一个个单独的变量,而是声明一个就像 numbers 这样的变量,然后使用 numbers[0]、numbers[1]、...、numbers[99] 来表示一个个单独的变量。数组中某个指定的元素是通过索引来访问的。

数组的第一个元素索引为0,最后一个元素的索引为元素总数减1。

声明数组

以下是 Scala 数组声明的语法格式:

var z:Array[String] = new Array[String](3)
或
var z = new Array[String](3)

以上语法中,z 声明一个字符串类型的数组,数组长度为 3 ,可存储 3 个元素。我们可以为每个元素设置值,并通过索引来访问每个元素,如下所示:

z(0) = "w3codebox"; z(1) = "Baidu"; z(4/2) = "Google"

最后一个元素的索引使用了表达式 4/2 作为索引,类似于 z(2) = "Google".

我们也可以使用以下方式来定义一个数组:

var z = Array("w3codebox", "Baidu", "Google")

下图展示了一个长度为 10 的数组 myList,索引值为 0 到 9:

处理数组

数组的元素类型和数组的大小都是确定的,所以当处理数组元素时候,我们通常使用基本的 for 循环。

以下示例演示了数组的创建,初始化等处理过程:

object Test {
   def main(args: Array[String]) {
      var myList = Array(1.9, 2.9, 3.4, 3.5)
      
      // إخراج جميع عناصر الصف
      for ( x <- myList ) {
         println(x)
      }
      // 计算数组所有元素的总和
      var total = 0.0;
      for ( i <- 0 to (myList.length - 1)) {
         total += myList(i);
      }
      println("المجموع هو " + total);
      // إيجاد أكبر عنصر في المصفوفة
      var max = myList(0);
      لـ (i <- 1 to (myList.length - 1)) {
         if (myList(i) > max) max = myList(i);
      }
      println("القيمة الأكبر هي " + max);
    
   }
}

عند تنفيذ الكود أعلاه، الناتج هو:

$ scalac Test.scala
$ scala Test
1.9
2.9
3.4
3.5
المجموع هو 11.7
القيمة الأكبر هي 3.5

المصفوفات المتعددة الأبعاد

المصفوفات المتعددة الأبعاد هي تلك التي يمكن أن تكون قيمها مصفوفة أخرى، والقيم في المصفوفة الأخرى يمكن أن تكون مصفوفة أخرى. المصفوفات والمسافات هي مصفوفات ثنائية شائعة.

هذا مثال على تعريف مصفوفة ثنائية:

val myMatrix = Array.ofDim[Int](3, 3)

يحتوي هذا المثال على ثلاثة عناصر مصفوفة، كل منها يحتوي على ثلاثة قيم.

دعنا نرى مثالاً شاملاً لمعالجة مصفوفة ثنائية:

import Array._
object Test {
   def main(args: Array[String]) {
      val myMatrix = Array.ofDim[Int](3, 3)
      
      // إنشاء مصفوفة
      لـ (i <- 0 to 2) {
         لـ (j <- 0 to 2) {
            myMatrix(i)(j) = j;
         }
      }
      
      // طباعة مصفوفة ثنائية
      لـ (i <- 0 to 2) {
         لـ (j <- 0 to 2) {
            print(" " + myMatrix(i)(j));
         }
         println();
      }
    
   }
}

عند تنفيذ الكود أعلاه، الناتج هو:

$ scalac Test.scala
$ scala Test
0 1 2
0 1 2
0 1 2

دمج الأعداد

في المثال التالي، استخدمنا طريقة concat() لدمج مصفوفتين، concat() تقبل عدة معامل مصفوفة:

import Array._
object Test {
   def main(args: Array[String]) {
      var myList1 = Array(1.9, 2.9, 3.4, 3.5)
      var myList2 = Array(8.9, 7.9, 0.4, 1.5)
      var myList3 = concat(myList1, myList2)
      
      // إخراج جميع عناصر الصف
      لـ (x <- myList3) {
         println(x)
      }
   }
}

عند تنفيذ الكود أعلاه، الناتج هو:

$ scalac Test.scala
$ scala Test
1.9
2.9
3.4
3.5
8.9
7.9
0.4
1.5

إنشاء مصفوفة نطاق

في المثال التالي، استخدمنا طريقة range() لإنشاء مصفوفة نطاق. يعتمد最后一个 معامل لـ range() على الخطوة، والتي تكون افتراضياً 1:

import Array._
object Test {
   def main(args: Array[String]) {
      var myList1 = range(10, 20, 2)
      var myList2 = range(10, 20)
      // إخراج جميع عناصر الصف
      لـ (x <- myList1) {
         print( " " + x )
      }
      println()
      for ( x <- myList2 ) {
         print( " " + x )
      }
   }
}

عند تنفيذ الكود أعلاه، الناتج هو:

$ scalac Test.scala
$ scala Test
10 12 14 16 18
10 11 12 13 14 15 16 17 18 19

طرق الأعداد في Scala

في الجدول أدناه، هناك طرق مهمة لتعامل الأعداد في لغة Scala، ونحتاج إلى استخدامها قبل استخدامها import Array._ استيراد حزمة.

رقمالطريقة والوصف
1

def apply( x: T, xs: T* ): Array[T]

إنشاء عدد معين من العنصر T، يمكن أن يكون T هو Unit, Double, Float, Long, Int, Char, Short, Byte, Boolean.

2

def concat[T]( xss: Array[T]* ): Array[T]

دمج الأعداد

3

def copy( src: AnyRef, srcPos: Int, dest: AnyRef, destPos: Int, length: Int ): Unit

نسخ عدد إلى آخر. يساوي Java's System.arraycopy(src, srcPos, dest, destPos, length).

4

def empty[T]: Array[T]

يعود بثلاثة أعداد، طولها معين بواسطة الأول، ويتم تعبئة كل عنصر باستخدام الثاني.

5

def iterate[T]( start: T, len: Int )( f: (T) => T ): Array[T]

يعود بثلاثة أعداد، طولها معين بواسطة الأول، ويتم تعبئة كل عنصر باستخدام الثاني.

على سبيل المثال، قيمة البداية للعدد هي 0، طولها 3، والوظيفة الحسابية هيa=>a+1

scala> Array.iterate(0,3)(a=>a+1)
res1: Array[Int] = Array(0, 1, 2)
6

def fill[T]( n: Int )(elem: =>  T): Array[T]

يعود بثلاثة أعداد، طولها معين بواسطة الأول، ويتم تعبئة كل عنصر باستخدام الثاني.

7

def fill[T]( n1: Int, n2: Int )( elem: => T ): Array[Array[T]]

يعود بثلاثة أعداد، طولها معين بواسطة الأول، ويتم تعبئة كل عنصر باستخدام الثاني.

8

def ofDim[T]( n1: Int ): Array[T]

إنشاء مصفوفة بطول معين

9

def ofDim[T]( n1: Int, n2: Int ): Array[Array[T]]

إنشاء مصفوفة ثنائية الأبعاد

10

def ofDim[T]( n1: Int, n2: Int, n3: Int ): Array[Array[Array[T]]]

إنشاء مصفوفة ثلاثية الأبعاد

11

def range( start: Int, end: Int, step: Int ): Array[Int]

إنشاء مصفوفة بحدود معينة، حيث يكون step هو طول كل عنصر

12

def range( start: Int, end: Int ): Array[Int]

إنشاء مصفوفة بحدود معينة

13

def tabulate[T]( n: Int )(f: (Int) => T): Array[T]

إرجاع مصفوفة بطول معين، حيث يكون كل عنصر في المصفوفة عنصرًا لـ function المحدد، ويبدأ بشكل افتراضي من 0.

السطر التالي يعود 3 عناصر:

scala> Array.tabulate(3)(a => a + 5)
res0: Array[Int] = Array(5, 6, 7)
14

def tabulate[T]( n1: Int, n2: Int )( f: (Int, Int) => T): Array[Array[T]]

إرجاع مصفوفة ثنائية الأبعاد بطول معين، حيث يكون كل عنصر في المصفوفة عنصرًا لـ function المحدد، ويبدأ بشكل افتراضي من 0.