SlideShare a Scribd company logo
1 of 27
Download to read offline
17.	
  Collec*ons	

   Joongjin	
  Bae	
  
  Ameba:dudug	
  
  twi;er:bae_j
Index	
•  Sequences	
  
    –  Lists,	
  Arrays,	
  List	
  buffers,	
  Array	
  buffers,	
  StringOps	
  
•  Sets	
  and	
  Maps	
  
    –  Using	
  Sets	
  and	
  Maps,	
  Default,	
  Sorted	
  
•  Mutable	
  vs.	
  Immutable	
  collec*ons	
  
•  Ini*alizing	
  collec*ons	
  
    –  Conver*ng	
  array	
  or	
  list,	
  mutable	
  and	
  immutable	
  
       sets	
  and	
  maps	
  	
  
•  Tuples	
  
Sequences	

Array	
  Listは触れません
ListBuffer	
Listは先頭からは速いが末尾からは遅い。	
  
Listを逆にして先頭から接続するか	
  
ListBufferを利用する。	
  
ListBufferはmutableであり、append,	
  prepend演
算(opera*on)可能	
  
+=	
  append	
  (ex	
  buf	
  +=	
  1)	
  
+=:	
  prepend	
  (ex	
  4	
  +=:	
  buf)	
  
=>	
  buf.type	
  =	
  ListBuffer(4,1)	
  
ListBuffer	
•  buf.toListでList取得可能	
  
•  Listの代わりにListBufferを使う理由はstack	
  
   overflowを回避するため	
  
  –  詳細は22章で
ArrayBuffer	
•  ListBuffer同様、mutable,	
  append,	
  prepend可
   能	
  
   –  buf	
  +=	
  12	
  
   –  14	
  +=:	
  buf	
  
   –  buf.toArray	
  =>	
  Array	
  (14,	
  12)	
  
•  scala.collec*on.mutable.ArrayBuffer	
  import必
   須	
  
•  buf.length	
  =>	
  2,	
  buf(0)	
  =>	
  14	
  利用可能	
  
ArrayBuffer	
•  前後から接続、追加、削除可能	
  
•  Arrayのすべての操作可能、ちょっと遅い	
  
  –  Wrapperだから	
  
•  追加/削除は平均O(1)(constant	
  *me	
  on	
  
   average)がたまにO(n)になる	
  
  –  配列の再構築が必要だから
StringOps	
def	
  hasUpperCase(s:	
  String)	
  =	
  s.exists(_.isUpper)	
  
hasUpperCase(“Scala”)	
  =>	
  true	
  
hasUpperCase(“scala”)	
  =>	
  false	
  
	
  
Stringはexistsメソッドがない。	
  
なぜ実行出来る?
StringOps	
•  コンパイラがs	
  Stringを暗黙的にStringOpsへ
   変換し実行する	
  
•  existsメソッドはcharの配列として扱い
Sets	
  and	
  maps	

使い方は触れません
Default	
  sets	
  and	
  maps	
•  Set(),	
  Map()で簡単に生成できる。	
  
•  速いアルゴリズム(hashtable)を使ってobject
   がcollec*onの中に存在するか判断	
  
•  mutable.Set(),	
  mutable.Map()は	
  
   HashSet,	
  HashMapを生成	
  
•  immutableの場合、要素数によって違うobject
   を返す
Default	
  sets	
  and	
  maps	

              immutable.Set()	
要素数	
                   実装	
0	
                     immutable.EmptySet	
1	
                     immutable.Set1	
2	
                     immutable.Set2	
3	
                     immutable.Set3	
4	
                     immutable.Set4	
5	
                     immutable.HashSet
Default	
  sets	
  and	
  maps	

            immutable.Map()	
要素数	
                   実装	
0	
                     immutable.EmptyMap	
1	
                     immutable.Map1	
2	
                     immutable.Map2	
3	
                     immutable.Map3	
4	
                     immutable.Map4	
5	
                     immutable.HashMap
Sorted	
  sets	
  and	
  maps	
•  SortedSet,	
  SortedMap提供(Trait)	
  
•  赤黒木を使ったTreeSet,	
  TreeMapで実装され
   ている。	
  
mutable	
  vs.	
  immutable	
•  mutableがよく動く場合とimmutableがよく動く
   場合がある。	
  
•  どちを使うか迷う場合はimmutableを使う。	
  
 –  後でmutableへ変換すれば良い	
  
 –  サイズが小さい
mutable	
  vs.	
  immutable	
•  scalaはimmutableómutable変換しやすくす
   るsyntac*c	
  sugarを提供	
  
  –  immutableの場合	
  +=	
  メソッドが定義されてない	
  
  –  interpreterが	
  a	
  +=	
  b	
  =>	
  a	
  =	
  a	
  +	
  bに解析
+=	
  example	
val	
  people	
  =	
  Set(“B”,	
  “土橋”)	
  
people	
  +=	
  “木本”	
  
	
  
var	
  people	
  =	
  Set(“B”,	
  “土橋”)	
  
people	
  +=	
  “木本”	
  
	
  
-­‐=	
  ++=	
  例	
people	
  -­‐=	
  “B”	
  
people	
  ++=	
  List(“Bae”,	
  “Kim”)	
  
people	
  ?	
  
	
  
immutable.Set[java.lang.String]	
  =	
  Set(土橋,	
  木
本,	
  Bae,	
  Kim)	
  
Ini*alizing	
  collec*ons	
•  factoryメソッドの引数として渡す	
  
  –  List(1,2,3)	
  
  –  Set(‘a’,’b,’c’)	
  
  –  mutable.Map(“hi”	
  -­‐>	
  2,	
  “there”	
  -­‐>	
  5)	
  
•  コンパイラが適切な型を設定する。	
  
  –  List[Int]	
  
  –  Set[Char]	
  
  –  mutable.Map[String,	
  Int]	
  
Ini*alizing	
  collec*ons	
•  この場合は?	
  
val	
  stuff	
  =	
  mutable.Set(42)	
  
stuff	
  +=	
  “abc”	
  
	
  
最初生成時IntになっているためStringは追加で
きない。	
  
解決:val	
  stuff	
  =	
  mutable.Set[Any](42)
Ini*alizing	
  collec*ons	
•  collec*on生成時collec*onを引数として渡した
   い場合	
  
val	
  colors	
  =	
  List(“red”,	
  “blue”)	
  
val	
  treeSet	
  =	
  TreeSet(colors)	
  =>	
  error	
  
val	
  treeSet	
  =	
  TreeSet()	
  ++	
  colors	
  
Conver*ng	
  to	
  array	
  or	
  list	
•  Just	
  invoke	
  toList/toArray	
  
   –  treeSet.toArray	
  
   –  colors.toArray	
  
•  toArrayの結果は?	
  
   –  treeSet	
  (blue,	
  red)	
  
   –  colors	
  (red,	
  blue)	
  
•  toList/toArrayはcollec*onのコピーなのでコス
   トに注意
Conver*ng	
  mutable	
  ó	
  immutable	
treeSet	
  =>	
  (blue,	
  red)	
  
val	
  mutaSet	
  =	
  mutable.Set.empty	
  ++=	
  treeSet	
  
val	
  immutaSet	
  =	
  Set.empty	
  ++	
  mutaSet
Tuples	
•  異なるtype	
  objectを持つ配列	
  
  –  (1,	
  “hello”,	
  Console)	
  
•  Javaの場合複数の戻り値を返したい場合、
   DTO又はPairクラス等を実装する必要有り	
  
•  ScalaはTupleを使えば簡単
Tuple使い方	
def	
  longestWord(words:	
  Array[String])	
  =	
  {	
  
	
  	
  var	
  word	
  =	
  words(0)	
  
	
  	
  var	
  idx	
  =	
  0	
  
	
  	
  for	
  (i	
  <-­‐	
  1	
  un*l	
  words.length)	
  
	
  	
  	
  	
  if	
  (words(i).length	
  >	
  word.length)	
  {	
  
	
  	
  	
  	
  	
  	
  word	
  =	
  words(i)	
  
	
  	
  	
  	
  	
  	
  idx	
  =	
  i	
  
	
  	
  	
  	
  }	
  
	
  	
  (word,	
  idx)	
  
}
Tuple使い方	
val	
  longest	
  =	
  longestWord(“The	
  quick	
  brown	
  
fox”.split(“	
  ”)	
  
	
  	
  	
  	
  	
  	
  	
  result	
  =>	
  (quick,	
  1)	
  
	
  
•  結果のTupleを使う場合_1,	
  _2を利用	
  
   –  longest._1	
  =>	
  quick	
  
   –  longest._2	
  =>	
  1	
  
   	
  
Tuple使い方	
–  val	
  (word,	
  idx)	
  =	
  longest	
  
   word:	
  String	
  =	
  quick	
  
   idx:	
  Int	
  =	
  1	
  
–  val	
  word,	
  idx	
  =	
  longest	
  
   word:	
  (String,	
  Int)	
  =	
  (quick,	
  1)	
  
   idx:	
  (String,	
  Int)	
  =	
  (quick,	
  1)

More Related Content

What's hot

プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~Takuya Akiba
 
Real World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみたReal World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみたblackenedgold
 
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」Nagi Teramo
 
リストモナドを作ってみた
リストモナドを作ってみたリストモナドを作ってみた
リストモナドを作ってみたAtsushi Kanehara
 
PFDS 5.5 Pairing heap
PFDS 5.5 Pairing heapPFDS 5.5 Pairing heap
PFDS 5.5 Pairing heap昌平 村山
 
たのしい高階関数
たのしい高階関数たのしい高階関数
たのしい高階関数Shinichi Kozake
 
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCamlHaruka Oikawa
 
色々なダイクストラ高速化
色々なダイクストラ高速化色々なダイクストラ高速化
色々なダイクストラ高速化yosupo
 
モナドがいっぱい!
モナドがいっぱい!モナドがいっぱい!
モナドがいっぱい!Kenta Sato
 
すごいH 第12章モノイド
すごいH 第12章モノイドすごいH 第12章モノイド
すごいH 第12章モノイドShinta Hatatani
 
Imputation of Missing Values using Random Forest
Imputation of Missing Values using  Random ForestImputation of Missing Values using  Random Forest
Imputation of Missing Values using Random ForestSatoshi Kato
 
Union find(素集合データ構造)
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)AtCoder Inc.
 
10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920 10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920 Nobuaki Oshiro
 
Rubysapporo Stringsearch
Rubysapporo StringsearchRubysapporo Stringsearch
Rubysapporo StringsearchAkio Ishida
 
2016年第二回プレ卒研in山口研
2016年第二回プレ卒研in山口研2016年第二回プレ卒研in山口研
2016年第二回プレ卒研in山口研dmcc2015
 

What's hot (20)

直交領域探索
直交領域探索直交領域探索
直交領域探索
 
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
 
Real World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみたReal World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみた
 
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
 
リストモナドを作ってみた
リストモナドを作ってみたリストモナドを作ってみた
リストモナドを作ってみた
 
PFDS 5.5 Pairing heap
PFDS 5.5 Pairing heapPFDS 5.5 Pairing heap
PFDS 5.5 Pairing heap
 
たのしい高階関数
たのしい高階関数たのしい高階関数
たのしい高階関数
 
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml
 
色々なダイクストラ高速化
色々なダイクストラ高速化色々なダイクストラ高速化
色々なダイクストラ高速化
 
モナドがいっぱい!
モナドがいっぱい!モナドがいっぱい!
モナドがいっぱい!
 
すごいH 第12章モノイド
すごいH 第12章モノイドすごいH 第12章モノイド
すごいH 第12章モノイド
 
動的計画法
動的計画法動的計画法
動的計画法
 
外れ値
外れ値外れ値
外れ値
 
Imputation of Missing Values using Random Forest
Imputation of Missing Values using  Random ForestImputation of Missing Values using  Random Forest
Imputation of Missing Values using Random Forest
 
Union find(素集合データ構造)
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)
 
10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920 10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920
 
20140920 tokyo r43
20140920 tokyo r4320140920 tokyo r43
20140920 tokyo r43
 
Rubysapporo Stringsearch
Rubysapporo StringsearchRubysapporo Stringsearch
Rubysapporo Stringsearch
 
2016年第二回プレ卒研in山口研
2016年第二回プレ卒研in山口研2016年第二回プレ卒研in山口研
2016年第二回プレ卒研in山口研
 
全域木いろいろ
全域木いろいろ全域木いろいろ
全域木いろいろ
 

Similar to Programming in Scala Chapter 17 Collections

純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門Kimikazu Kato
 
scala.collection 再入門 (改)
scala.collection 再入門 (改)scala.collection 再入門 (改)
scala.collection 再入門 (改)Ryuichi ITO
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Ransui Iso
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニックGenya Murakami
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜Hiromi Ishii
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門Hideyuki Tanaka
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~Nobuhisa Koizumi
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタートShumpei Shiraishi
 
すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」
すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」
すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」Shin Ise
 
Ruby科学データ処理ツールの開発 NArrayとPwrake
Ruby科学データ処理ツールの開発 NArrayとPwrakeRuby科学データ処理ツールの開発 NArrayとPwrake
Ruby科学データ処理ツールの開発 NArrayとPwrakeMasahiro Tanaka
 
Ruby 3の型推論やってます
Ruby 3の型推論やってますRuby 3の型推論やってます
Ruby 3の型推論やってますmametter
 
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)Satoshi Yamada
 

Similar to Programming in Scala Chapter 17 Collections (12)

純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
 
scala.collection 再入門 (改)
scala.collection 再入門 (改)scala.collection 再入門 (改)
scala.collection 再入門 (改)
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニック
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタート
 
すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」
すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」
すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」
 
Ruby科学データ処理ツールの開発 NArrayとPwrake
Ruby科学データ処理ツールの開発 NArrayとPwrakeRuby科学データ処理ツールの開発 NArrayとPwrake
Ruby科学データ処理ツールの開発 NArrayとPwrake
 
Ruby 3の型推論やってます
Ruby 3の型推論やってますRuby 3の型推論やってます
Ruby 3の型推論やってます
 
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
 

More from Joongjin Bae

The secret to building good development teams
The secret to building good development teamsThe secret to building good development teams
The secret to building good development teamsJoongjin Bae
 
Reactive summit 2018
Reactive summit 2018Reactive summit 2018
Reactive summit 2018Joongjin Bae
 
[LT] Continuous Delivery
[LT] Continuous Delivery [LT] Continuous Delivery
[LT] Continuous Delivery Joongjin Bae
 
SEDA – Staged Event-Driven Architecture
SEDA – Staged Event-Driven ArchitectureSEDA – Staged Event-Driven Architecture
SEDA – Staged Event-Driven ArchitectureJoongjin Bae
 
理想の開発論-LT用
理想の開発論-LT用理想の開発論-LT用
理想の開発論-LT用Joongjin Bae
 
Aerospike紹介-LT用
Aerospike紹介-LT用Aerospike紹介-LT用
Aerospike紹介-LT用Joongjin Bae
 
Chapter 8 : Evaluation in Information Retrieval
Chapter 8 : Evaluation in Information RetrievalChapter 8 : Evaluation in Information Retrieval
Chapter 8 : Evaluation in Information RetrievalJoongjin Bae
 
voldemortの技術 - Dynamoとの比較
voldemortの技術 - Dynamoとの比較voldemortの技術 - Dynamoとの比較
voldemortの技術 - Dynamoとの比較Joongjin Bae
 
Cpuの速度向上はいかに実現されたのか
Cpuの速度向上はいかに実現されたのかCpuの速度向上はいかに実現されたのか
Cpuの速度向上はいかに実現されたのかJoongjin Bae
 

More from Joongjin Bae (10)

The secret to building good development teams
The secret to building good development teamsThe secret to building good development teams
The secret to building good development teams
 
Reactive summit 2018
Reactive summit 2018Reactive summit 2018
Reactive summit 2018
 
[LT] Continuous Delivery
[LT] Continuous Delivery [LT] Continuous Delivery
[LT] Continuous Delivery
 
SEDA – Staged Event-Driven Architecture
SEDA – Staged Event-Driven ArchitectureSEDA – Staged Event-Driven Architecture
SEDA – Staged Event-Driven Architecture
 
理想の開発論-LT用
理想の開発論-LT用理想の開発論-LT用
理想の開発論-LT用
 
Aerospike紹介-LT用
Aerospike紹介-LT用Aerospike紹介-LT用
Aerospike紹介-LT用
 
Chapter 8 : Evaluation in Information Retrieval
Chapter 8 : Evaluation in Information RetrievalChapter 8 : Evaluation in Information Retrieval
Chapter 8 : Evaluation in Information Retrieval
 
voldemortの技術 - Dynamoとの比較
voldemortの技術 - Dynamoとの比較voldemortの技術 - Dynamoとの比較
voldemortの技術 - Dynamoとの比較
 
Cpuの速度向上はいかに実現されたのか
Cpuの速度向上はいかに実現されたのかCpuの速度向上はいかに実現されたのか
Cpuの速度向上はいかに実現されたのか
 
MapReduce基礎
MapReduce基礎MapReduce基礎
MapReduce基礎
 

Programming in Scala Chapter 17 Collections

  • 1. 17.  Collec*ons Joongjin  Bae   Ameba:dudug   twi;er:bae_j
  • 2. Index •  Sequences   –  Lists,  Arrays,  List  buffers,  Array  buffers,  StringOps   •  Sets  and  Maps   –  Using  Sets  and  Maps,  Default,  Sorted   •  Mutable  vs.  Immutable  collec*ons   •  Ini*alizing  collec*ons   –  Conver*ng  array  or  list,  mutable  and  immutable   sets  and  maps     •  Tuples  
  • 4. ListBuffer Listは先頭からは速いが末尾からは遅い。   Listを逆にして先頭から接続するか   ListBufferを利用する。   ListBufferはmutableであり、append,  prepend演 算(opera*on)可能   +=  append  (ex  buf  +=  1)   +=:  prepend  (ex  4  +=:  buf)   =>  buf.type  =  ListBuffer(4,1)  
  • 5. ListBuffer •  buf.toListでList取得可能   •  Listの代わりにListBufferを使う理由はstack   overflowを回避するため   –  詳細は22章で
  • 6. ArrayBuffer •  ListBuffer同様、mutable,  append,  prepend可 能   –  buf  +=  12   –  14  +=:  buf   –  buf.toArray  =>  Array  (14,  12)   •  scala.collec*on.mutable.ArrayBuffer  import必 須   •  buf.length  =>  2,  buf(0)  =>  14  利用可能  
  • 7. ArrayBuffer •  前後から接続、追加、削除可能   •  Arrayのすべての操作可能、ちょっと遅い   –  Wrapperだから   •  追加/削除は平均O(1)(constant  *me  on   average)がたまにO(n)になる   –  配列の再構築が必要だから
  • 8. StringOps def  hasUpperCase(s:  String)  =  s.exists(_.isUpper)   hasUpperCase(“Scala”)  =>  true   hasUpperCase(“scala”)  =>  false     Stringはexistsメソッドがない。   なぜ実行出来る?
  • 9. StringOps •  コンパイラがs  Stringを暗黙的にStringOpsへ 変換し実行する   •  existsメソッドはcharの配列として扱い
  • 11. Default  sets  and  maps •  Set(),  Map()で簡単に生成できる。   •  速いアルゴリズム(hashtable)を使ってobject がcollec*onの中に存在するか判断   •  mutable.Set(),  mutable.Map()は   HashSet,  HashMapを生成   •  immutableの場合、要素数によって違うobject を返す
  • 12. Default  sets  and  maps immutable.Set() 要素数 実装 0 immutable.EmptySet 1 immutable.Set1 2 immutable.Set2 3 immutable.Set3 4 immutable.Set4 5 immutable.HashSet
  • 13. Default  sets  and  maps immutable.Map() 要素数 実装 0 immutable.EmptyMap 1 immutable.Map1 2 immutable.Map2 3 immutable.Map3 4 immutable.Map4 5 immutable.HashMap
  • 14. Sorted  sets  and  maps •  SortedSet,  SortedMap提供(Trait)   •  赤黒木を使ったTreeSet,  TreeMapで実装され ている。  
  • 15. mutable  vs.  immutable •  mutableがよく動く場合とimmutableがよく動く 場合がある。   •  どちを使うか迷う場合はimmutableを使う。   –  後でmutableへ変換すれば良い   –  サイズが小さい
  • 16. mutable  vs.  immutable •  scalaはimmutableómutable変換しやすくす るsyntac*c  sugarを提供   –  immutableの場合  +=  メソッドが定義されてない   –  interpreterが  a  +=  b  =>  a  =  a  +  bに解析
  • 17. +=  example val  people  =  Set(“B”,  “土橋”)   people  +=  “木本”     var  people  =  Set(“B”,  “土橋”)   people  +=  “木本”    
  • 18. -­‐=  ++=  例 people  -­‐=  “B”   people  ++=  List(“Bae”,  “Kim”)   people  ?     immutable.Set[java.lang.String]  =  Set(土橋,  木 本,  Bae,  Kim)  
  • 19. Ini*alizing  collec*ons •  factoryメソッドの引数として渡す   –  List(1,2,3)   –  Set(‘a’,’b,’c’)   –  mutable.Map(“hi”  -­‐>  2,  “there”  -­‐>  5)   •  コンパイラが適切な型を設定する。   –  List[Int]   –  Set[Char]   –  mutable.Map[String,  Int]  
  • 20. Ini*alizing  collec*ons •  この場合は?   val  stuff  =  mutable.Set(42)   stuff  +=  “abc”     最初生成時IntになっているためStringは追加で きない。   解決:val  stuff  =  mutable.Set[Any](42)
  • 21. Ini*alizing  collec*ons •  collec*on生成時collec*onを引数として渡した い場合   val  colors  =  List(“red”,  “blue”)   val  treeSet  =  TreeSet(colors)  =>  error   val  treeSet  =  TreeSet()  ++  colors  
  • 22. Conver*ng  to  array  or  list •  Just  invoke  toList/toArray   –  treeSet.toArray   –  colors.toArray   •  toArrayの結果は?   –  treeSet  (blue,  red)   –  colors  (red,  blue)   •  toList/toArrayはcollec*onのコピーなのでコス トに注意
  • 23. Conver*ng  mutable  ó  immutable treeSet  =>  (blue,  red)   val  mutaSet  =  mutable.Set.empty  ++=  treeSet   val  immutaSet  =  Set.empty  ++  mutaSet
  • 24. Tuples •  異なるtype  objectを持つ配列   –  (1,  “hello”,  Console)   •  Javaの場合複数の戻り値を返したい場合、 DTO又はPairクラス等を実装する必要有り   •  ScalaはTupleを使えば簡単
  • 25. Tuple使い方 def  longestWord(words:  Array[String])  =  {      var  word  =  words(0)      var  idx  =  0      for  (i  <-­‐  1  un*l  words.length)          if  (words(i).length  >  word.length)  {              word  =  words(i)              idx  =  i          }      (word,  idx)   }
  • 26. Tuple使い方 val  longest  =  longestWord(“The  quick  brown   fox”.split(“  ”)                result  =>  (quick,  1)     •  結果のTupleを使う場合_1,  _2を利用   –  longest._1  =>  quick   –  longest._2  =>  1    
  • 27. Tuple使い方 –  val  (word,  idx)  =  longest   word:  String  =  quick   idx:  Int  =  1   –  val  word,  idx  =  longest   word:  (String,  Int)  =  (quick,  1)   idx:  (String,  Int)  =  (quick,  1)