記事ディレクトリ
1.3 Scalaのデータ構造
どのプログラミング言語にとっても、配列 (Array) は重要なデータ構造の 1 つであり、主に同じデータ型の要素を格納するために使用されます。Scala の配列は固定長配列と可変長配列に分けられます。固定長配列を定義するには new キーワードを使用する必要があります。可変長配列を定義する場合は、パッケージ import scala.collection をインポートする必要があります。 .mutable.ArrayBuffer。
1.3.1 配列
配列(Array)は主に各要素のデータ型を格納するために使用されます。
-
配列の定義と使い方
Scala の配列は固定長配列と可変長配列に分かれており、これら 2 つの配列は次のように定義されます。 -
固定長配列を定義
New Array[T] (配列長) //固定長配列を定義 -
可変長配列の定義
ArrayBuffer T //可変長配列の定義
注: 固定長配列を定義するには new キーワードを使用する必要があり、可変長配列を定義するには import scala.collection.mutable.ArrayBuffer パッケージをインポートする必要があります。
以下では、例を使用して Scala 配列の簡単な使用法を示します。具体的なコードは次のとおりです。
package cn.itcast.scala
import scala.collection.mutable.ArrayBuffer
object Ch01_ArrayDemo {
def main(args: Array[String]): Unit = {
//定义定长数组:定义长度为8的定长数组,数组中的每个元素初始化为0
val arr1 = new Array[Int](8)
//打印数组,内容是数组的hashcode值
println(arr1)
//定义变长数组(数组缓冲),需要导入包:import scala.collection.mutable.ArrayBuffer
val arr2 = ArrayBuffer[Int]()
//向变长数组中追加元素
arr2 += 1
//打印变长数组
println(arr2)
//向变长数组中追加多个元素
arr2 += (2,3,4,5)
println(arr2)
//追加一个定长数组
arr2 ++= Array(6,7)
println(arr2)
//追加一个变长数组(数组缓冲)
arr2 ++= ArrayBuffer(8,9)
println(arr2)
//在变长数组的某个位置插入元素
arr2.insert(0,-1,0)
println(arr2)
//删除数组的某个元素
arr2.remove(0)
println(arr2)
}
}
配列トラバーサル
Scala では、配列内の各要素を取得したい場合は、配列を走査する必要があります。コードは以下のように表示されます。
package cn.itcast.scala
object Ch02_ArrayTraversal {
def main(args: Array[String]): Unit = {
//定义定长数组
//val array = new Array[Int](8) //方式1
val myArr = Array(1.9, 2.9, 3.4, 3.5) //方式2
//打印输出数组中的所有元素
for(x<-myArr){
print(x+" ")
}
println()
//计算数组中所有元素的和
var total = 0.0
for(i <- 0 to (myArr.length-1)){
total += myArr(i)
}
println("总和为:"+total)
//查找数组中的最大值
var max = myArr(0)
for(i <- 1 to (myArr.length-1)){
if(max < myArr(i)){
max = myArr(i)
}
}
println("最大值为:"+max)
}
}
配列変換
配列変換は、yield キーワードを使用して元の配列を変換することであり、新しい配列が生成されますが、元の配列は変更されません。偶数を取り出して10倍した後、新しい配列を生成する配列を定義します。具体的なコードは次のとおりです。
package cn.itcast.scala
object Ch03_ArrayYieldTest {
def main(args: Array[String]): Unit = {
//定义一个数组
var arr = Array(1,2,3,4,5,6,7,8,9)
//将偶数取出乘以10后再生成一个新的数组
val newArr = for (e <- arr if e%2 == 0) yield e * 10
println(newArr.toBuffer) //将定长数组转为变长数组
}
}
1.3.2 タプル
Scala のタプルは、異なる型の複数のオブジェクトを単純にカプセル化したもので、異なる値を括弧で囲み、カンマで区切ったものがタプルを意味します。
タプルを作成する
タプルを作成するための構文は次のとおりです。
val tuple=(元素,元素...)
以下では、簡単な例を使用してタプルの作成を示します。たとえば、String 型、Double 型、および Int 型を含むタプルを作成する場合、具体的なコードは次のとおりです。
scala> val tuple = ("itcast",3.14,65535)
tuple: (String, Double, Int) = (itcast,3.14,65535)
タプル内の値を取得します
Scala では、タプル内の値はアンダースコアと添字によって取得され (例: tuple._1、tuple._2)、タプル内の要素の添字は 1 から始まります。コードは以下のように表示されます。
scala> tuple._1 # 获取第一个值
res0: String = itcast
scala> tuple._2 # 获取第一个值
res1: Double = 3.14
ジップ操作
Scalaのタプルでは、「zip」コマンドを使用することで複数の値をバインドすることができます。たとえば、score と names という 2 つの配列を定義し、これら 2 つの配列をバンドルする場合の具体的なコードは次のとおりです。
scala> val scores = Array(88,95,80)
scores: Array[Int] = Array(88, 95, 80)
scala> val names =Array("zhangsan","lisi","wangwu")
names: Array[String] = Array(zhangsan, lisi, wangwu)
scala> names.zip(scores)
res2: Array[(String, Int)] = Array((zhangsan,88), (lisi,95), (wangwu,80))
注: 2 つの配列の数が等しくない場合、短い方の長さが自動的に適応され、対応する一致する要素がない冗長な要素は自動的に破棄されます。
1.3.3 コレクション
Scala には、List、Set、Map の 3 種類のコレクションがあり、これらはすべて Iterable 特性を拡張します。
Scala コレクションは、可変コレクションと不変コレクションに分かれています。このうち、可変コレクションはその場で更新または拡張できます。つまり、コレクションの要素を変更、追加、削除できます。対照的に、不変コレクション クラスは初期化後に変更されません。
リスト
Scala では、リストのすべての要素が同じ型を持つという点で、リストは配列に似ています。ただし、配列とは異なり、リストは不変です。
さまざまなタイプのリスト List を定義します。具体的なコードは次のとおりです。
// 字符串
val fruit: List[String] =List("apples","oranges","pears")
// 整型
val nums: List[Int] = List(1, 2, 3, 4)
// 空
val empty: List[Nothing] = List()
// 二维列表
val dim: List[List[Int]] =
List(
List(1, 0, 0),
List(0, 1, 0),
List(0, 0, 1)
)
Scala では、「Nil」演算子と「::」演算子を使用してリストを定義できます。コードは以下のように表示されます。
// 字符串
val fruit = "apples":: ("oranges":: ("pears" :: Nil))
// 整型
val nums = 1 :: (2 :: (3 :: ( 4 :: Nil)))
// 空列表
val empty = Nil
// 二维列表
val dim = (1 :: (0 :: (0 :: Nil))) ::
(0 :: (1 :: (0 :: Nil))) ::
(0 :: (0 :: (1 :: Nil))) :: Nil
次の表に示すように、Scala には List を操作するためのメソッドも多数用意されています。
サンプルコードは次のとおりです。
package cn.itcast.scala
object Ch04_ListTest {
def main(args: Array[String]): Unit = {
//定义List集合
//val fruit:List[String] = List("apples","oranges","pears")
val fruit = "apples"::("oranges"::("pears"::Nil))
val nums = Nil
println("Head of fruit:" + fruit.head)
println("Tail of fruit:" + fruit.tail)
println("check if fruit is empty:"+fruit.isEmpty)
println("check if nums is empty:"+nums.isEmpty)
println("Take of fruit:"+fruit.take(2))
println("contains of fruit oranages:"+fruit.contains("oranges"))
}
}
セット
Scala では、Set は重複オブジェクトのないコレクションであり、すべての要素は一意です。デフォルトでは、Scala は不変の Set コレクションを使用しますが、変更可能な Set コレクションを使用したい場合は、scala.collection.mutable.Set パッケージを導入する必要があります。
Set コレクションを定義するための構文は次のとおりです。
val set: Set[Int] = Set(1,2,3,4,5)
Scala には、Set コレクションを操作するためのメソッドが多数用意されています。次に、次の表に示すように、Set コレクションを操作するための一般的なメソッドをいくつか示します。
具体的なコードは次のとおりです。
package cn.itcast.scala
object Ch05_SetTest {
def main(args: Array[String]): Unit = {
//定义Set集合
val site = Set("Itcast","Google","Baidu")
val nums:Set[Int] = Set()
println("第一个网站是:"+site.head)
println("最后一个网站是:"+site.tail)
println("site集合是否为空:"+site.isEmpty)
println("nums集合是否为空:"+nums.isEmpty)
println("查看site集合的前两个网站:"+nums.take(2))
println("site集合中是不包含网站Google:"+site.contains("Google"))
}
}
地図
Scala では、Map は反復可能なキーと値のペア (キー/値) 構造であり、キーは一意ですが、値は必ずしも一意ではなく、すべての値はキーを通じて取得されます。Map 内のすべての要素のキーと値の間には対応関係があり、この関係がマッピングです。Map には可変コレクションと不変コレクションの 2 種類があり、デフォルトは不変マップです。可変の Map コレクションを使用する必要がある場合は、import scala.collection.mutable.Map クラスを導入する必要があります。
Map コレクションを定義するための構文は次のとおりです。
var A:Map[Char,Int] = Map(键 -> 值,键 -> 值...) //Map键值对,键为Char,值为Int
Scala は、Map コレクションを操作するためのメソッドも多数提供します。次に、次の表に示すように、Map コレクションを操作するための一般的なメソッドをいくつかリストします。
サンプル コードは次のとおりです。
package cn.itcast.scala
object Ch06_MapTest {
def main(args: Array[String]): Unit = {
//定义Map集合
val colors = Map("red"-> "#FF0000",
"azure"-> "#F0FFFF",
"peru"-> "#CD853F")
val peruColor = if(colors.contains("peru")) colors("peru") else 0
val azureColor = colors.getOrElse("azure",0)
println("获取colors中键为red的值:"+colors("red"))
println("获取colors中所有的键:"+colors.keys)
println("获取colors中所有的值:"+colors.values)
println("检测colors是否为空:"+colors.isEmpty)
println("判断colors中是否包含键peru,包含则返回对应的值,否则返回0:"+peruColor)
println("判断colors中是否包含键azure,包含则返回对应的值,否则返回0:"+azureColor)
}
}
転載元: https://blog.csdn.net/u014727709/article/details/131679759
開始へようこそ、コメントへようこそ、修正へようこそ