第十章Scala容器基礎(二十七):元組

2918 ワード

Problem
集合要素のタイプが多様な集合を作成します.
Solution
メタグループは、コンテナ内に異なるタイプの要素を格納する方法を提供します.これは多くの場合に非常に役立ちます.
新しい元祖は、必要な額のグループを括弧のグループに包むことによって作成されます.次は二元祖です.
scala> val d = ("Debi", 95)
d: (String, Int) = (Debi,95)

2つの異なるタイプが含まれていることに注意してください.次の例では、三元祖を示します.
scala> val t = (3, "three", new Person("Al"))
t: (Int, String, Person) = (3,three,Person(Al))

下付き文字を使用して、メタグループ要素にアクセスできます.
scala> t._1
res0: Int = 3

scala> t._2
res1: String = three

scala> t._3
res2: Person = Person(Al)

通常、パターンマッチングによって元祖要素を変数にコピーします.
scala> val (x, y, z) = (3, "three", new Person("Al"))
x: Int = 3
y: String = three
z: Person = Person(Al)

このソリューションにはもう一つの素晴らしいメリットがあります.要素が必要でなければ、使用できます.この要素の代わりにワイルドカードを使用します.
scala> val (x, y, _) = (3, "three", new Person("Al"))
x: Int = 3
y: String = three

scala> val (x, _, _) = (3, "three", new Person("Al"))
x: Int = 3

scala> val (x, _, z) = (3, "three", new Person("Al"))
x: Int = 3
z: Person = Person(Al)

二元祖はTuple 2 classの例であり、三元祖はTuple 3 classの例である.次に、二元祖を作成する最も簡単な方法を示します.
scala> val a = ("AL", "Alabama")
a: (String, String) = (AL,Alabama)

次の方法でメタグループを作成することもできます.
scala> val b = "AL" -> "Alabama"
b: (String, String) = (AL,Alabama)

scala> val c = ("AL" -> "Alabama")
c: (String, String) = (AL,Alabama)

彼らのタイプを見ると、彼らはすべてTople 2であることがわかります.
scala> a.getClass
res6: Class[_ <: (String, String)] = class scala.Tuple2

scala> b.getClass
res7: Class[_ <: (String, String)] = class scala.Tuple2

scala> c.getClass
res8: Class[_ <: (String, String)] = class scala.Tuple2

この構文は、Mapを作成するためにも使用できます.
scala> val map = Map("AL" -> "Alabama")
map: scala.collection.immutable.Map[String,String] = Map(AL -> Alabama)

Discussion
メタグループはとても面白い構造です.しかし、要素メタグループは存在しません.APIではtupleクラスがTouple 2からTouple 22まで定義されており、1つの場所に2元から22元のメタグループを持つことができます.
メタグループの一般的な状況の1つは、メソッドが複数の結果を返すことです.この場合、集合ではなく戻り値としてメタグループが使用されます.tupleは集合ではありませんが、メタグループを集合として使用することができます.
scala> val x = ("AL" -> "Alabama")
x: (String, String) = (AL,Alabama)

scala> val it = x.productIterator
it: Iterator[Any] = non-empty iterator

scala> for (e <- it) println(e)
AL
Alabama

iteratorを使用してメタグループを巡回し、一度使用した後は使用できません.このメタグループを再び巡回する必要がある場合は、新しいiteratorを構築して使用する必要があります.
メタグループをセットに変換することもできます.
scala> val t = ("AL", "Alabama")
t: (String, String) = (AL,Alabama)

scala> t.productIterator.toVector
res13: Vector[Any] = Vector(AL, Alabama)