Scala学習3


モノトーンオブジェクト

  • オブジェクトを使用してモノトーンオブジェクト
  • を作成する.
  • モノトーンオブジェクトは、直接アクセスして使用することもできるし、import宣言として
  • を使用することもできる.
  • モノトーンオブジェクトの方法は、グローバルアクセスおよび参照
  • である.
    scala> object Bread {
    	| 	val name: String = "기본빵"
    	|	def cooking() = println("빵 만드는 중...")
    	| }
    scala> import Bread.cooking 	// import 
    scala> cooking
    빵 만드는 중...
    scala> Bread.cooking
    빵 만드는 중...

    Companions


    クラスが
  • のモノトーンオブジェクトと同じ名前である場合、コンパイラ
  • と呼ぶ.
  • Companionは静的メソッドのリポジトリを提供するため、Javaのsatic静的データはScaraでCompanionを使用できます.
  • Companionを使用して、工場メソッドなどの静的メソッドを作成する
  • scala> :paste	// companions은 class와 object가 동시에 선언되어야 하므로 paste mode로 입력 
    class Email(val username: String, val domainName: String)
    object Email {
    	def fromString(emailString:String): Option[Email] = {
    		emailString.split('@') match {
    			case Array(a, b) => Some(new Email(a, b))
    			case _ => None 
    		}
    	}
    }
    scala> :paste
    var scalaCenterEmail = Email.fromString("[email protected]") scalaCenterEmail match {
    	case Some(email) => println( 
    		s"""Registered an Email
    		| Username: ${email.username}
    		| Domain name: ${email.domainName}
    		""")
    	case None => println("Error: could not parse email")
    }
    scala>
    Registered an Email 
    Username: scala.center 
    Domain name: epfl.ch

    しゅうごうきほんデータこうぞう


    1) Array

  • 長さ固定データ構造
  • scala> val array1 = Array(1, 2, 3)
    scala> array1(0)	// 배열 데이터 접근 res0: Int = 1
    scala> array1(1) = 10	// 배열 데이터 변경 
    scala> array1(1)
    res1: Int = 10
    scala> val array2 = Array(3, 4, 5)
    scala> val array2 = array1 ++ array2	// 배열 연결하기 ++ 
    scala> val array4 = 0 +: array3	// 배열 앞에 데이터 추가 
    scala> val array5 = array3 :+ 100	// 배열 뒤에 데이터 추가

    2) List

  • 可変長データを格納データ構造
  • .
    scala> val list1 = List(10, 20, 30, 40) 
    scala> val list2 = (1 to 100).toList 
    scala> val list3 = array1.toList
    
    scala> list1
    List[Int] = List(10, 20, 30, 40) 
    scala> list1(2)
    Int = 30
    scala> list1.head
    Int = 10
    scala> list1.tail
    List[Int] = List(20, 30, 40)

    3) Set

  • を返し、重複を許さないデータ構造伝達値を返します.
    scala> val s1 = Set(1, 1, 2)
    scala> s1
    scala.collection.immutable.Set[Int] = Set(1, 2)
    
    // 전달된 값의 존재 여부 반환 scala> s1(1)
    Boolean = true
    scala> s1(2)
    Boolean = true 
    scala> s1(3) 
    Boolean = false

    4) Tuple

  • データ記憶構造
  • 複数の値
  • を記憶することができ、パターンマッチング
  • に使用することができる.
  • に近い値の場合、
  • に1、2の形式でアクセスする.
    scala> val hostPort = ("localhost", 80)	// 튜플 
    scala> hostPost._1
    String = localhost
    
    // 패턴매칭
    scala> def matchTest(hostPort: (String, Int)) = hostPort match { 
    	|	case ("localhost", port) => println(s"localhost, $port") 
    	|	case (host, port) => println(s"$host, $port")
    	| }
    scala> val hostPort1 = ("localhost", 80) 
    scala> val hostPort2 = ("localhost", 8080) 
    scala> val hostPort3 = ("127.0.0.1", 8080) 
    scala> matchTest(hortPort1)
    localhost, 80
    scala> matchTest(hortPort2) 
    localhost, 8080
    scala> matchTest(hortPort3) 
    127.0.0.1, 8080

    5) Map

  • 辞書形式記憶データの構成
  • がマッピングするデータを返すと、Optionタイプの
  • が戻る.
    scala> val map1 = Map(1 -> 2) 
    scala> val map2 = Map("foo" -> "bar")
    
    // Option 타입으로 반환 
    scala> map1.get(1) Option[Int] = Some(2)
    // getOrElse를 이용하여 키와 일치하는 데이터가 없으면 기본값을 반환하도록 설정 
    scala> map1.getOrElse(1, 0)
    Int = 2
    scala> map1.getOrElse(10, 0)
    Int = 0

    複文


    1)for文

  • toは、
  • 未満のシーケンスが生成されるまで、以下のリストを生成する.
    scala> for (num <- 0 to 3)	// 0에서 3이하의 시퀀스 | println(num)
    0
    1
    2
    3
    scala> for (num <- 0 until 3)	// 0에서 3미만의 시퀀스
    	|	println(num)
    0
    1 
    2
    
    scala> val strs = Array("A", "B", "C", "D", "E")
    scala> for (index <- 0 until str.length)	// 배열 길이만큼 인덱스 호출
    	| 	println(index, strs(index)) 
    (0,A)
    (1,B)
    (2,C)
    (3,D)
    (4,E)
    scala> for ((value, index) <- strs.zipWithIndex)	// zipWithIndex를 이용해 인덱스 호출
    	| 	println(value, index)
    (A,0)
    (B,1) 
    (C,2) 
    (D,3) 
    (E,4)
    
    scala> val map = Map("k1"->"v1", "k2"->"v2", "k3"->"v3") s
    cala> for ((k, v) <- map)	// 맵의 키,밸류는 튜플로 전달
    	| 	println(k, v) 
    (k2, v2)
    (k1, v1) 
    (k3, v3)
    
    scala> for (x <- 0 to 2; y <- 0 to 2; if x < 1; if y < 1)	// 세미콜론으로 이중 for, 조건식 추가 
    	| 	println(x, y)
    (0, 0)
  • for文が終了すると、for文によって生成された値シーケンス
  • が戻る.
    scala> def fives(n: Int) = {
    	| 	for(x <- 0 to n; if x % 5 == 0)
    	| 		yield x
    	| }
    scala> for (num <- fives(20))
    	| 	println(num)
    0 
    5 
    10 
    15 
    20
    
    // 0 에서 num 미만의 숫자로 이루어진 조합에서 합이 sum인 값의 조합 찾는 함수 
    scala> def checkSum(num: Int, sum: Int) =
    	| 	for(start <- 0 until num; inner <- start until num; if start + inner == sum)
    	| 		yield (start, inner);	// IndexedSeq 반환     
    scala> checkSum(20, 32) foreach {
    	| 	case (i, j) => println(s"($i, $j)")
    	| } 
    (13, 19) 
    (14, 18) 
    (15, 17) 
    (16, 16)

    2)while文

  • 条件はtrue日であり、
  • を繰り返す.
    scala> var i = 0 
    scala> do {
    	|	println(i)
    	|	i += 1 
    	| } while(i < 3)
    0
    1
    2
    
    scala> var num = 0 
    scala> while (num < 3) {
    	|	num += 1 
    	|	println(num)
    	} 
    0 
    1 
    2

    しゅうごうかんすう


    1) map

  • は、各項目について同じ動作を実行する
  • .
    scala> var list = (1 to 10)
    scala> list.map(_+1)
    Vector(2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
    
    scala> var strs = List("david", "kevin", "james") 
    scala> strs.map(_.toUpperCase)
    List("DAVID", "KEVIN", "JAMES")

    2) reduce, fold

  • データ要約
  • 使用
  • 各関数にはL/R方向があり、異なる演算方向によって異なる結果が生じる
  • .
  • 倍()関数はデフォルト
  • です.
    scala> var list = (1 to 10)
    scala> list.reduce(_+_)	// 55 
    scala> list.reduceLeft(_+_)	// 55 
    scala> list.reduce(_-_)	// -53 
    scala> list.reduceRight(_-_)	// -5 
    scala> list.fold(10)(_+_)	// 65

    3) groupBy

  • キーを押してデータ
  • をマージ
  • の結果をMap形式で返し、
  • を渡したキーとリスト形式で返す.
    scala> var datas = List(("A", 1), ("B", 2), ("C", 6), ("B", 2), ("A", 8), ("C", 2))
    
    // List내 1번째 param의 데이터를 키로 잡고 이를 기준으로 병합
    scala> datas.groupBy(_._1).foreach({ case (k, v) => printf("key: %s, value: %s\n", k, v) }) 
    key: A, value: List((A, 1), (A, 8))
    key: C, value: List((C, 6), (C, 2))
    key: B, value: List((B, 2), (B, 2))

    4) filter

    // filter: 콜렉션 데이터를 필터링해 없애거나 분류 scala> var list = (1 to 10)
    scala> list.filter(_ > 5)	// 5 이상의 데이터 분류 
    Vector(6, 7, 8, 9, 10)
    
    // partition: 콜렉션 분류
    scala> list.partition(_%3 == 0)	// 2로 나누어 나머지가 0인 데이터 분류 
    (Vector(3, 6, 9), Vector(1, 2, 4, 5, 7, 8, 10))
    
    // find: 데이터 검색
    scala> list.find(_ == 3)	// 3 검색 
    Option[Int] = Some(3)
    
    // takeWhile, dropWhile: 원하는 부분까지 데이터 선택 
    scala> var list2 = List(1, 2, 3, -1, 4)
    scala> list2.takeWhile(_ > 0)
    List(1, 2, 3)
    scala> list.dropWhile(_ < 3) 
    List(3, -1, 4)

    5) zip

  • は、2つのセットの同じインデックスを一緒に
  • に組み合わせることができる.
  • の長さが一致しない場合、
  • の数は小さくなります.
    scala> for (item <- List(1, 2, 3).zip(List(1, 2, 3))) 
    	|	println(item)
    (1, 1)
    (2, 2)
    (3, 3)
    scala> for (item <- List(1, 2, 3).zip(List(1, 2, 3, 4)))
    	| 	println(item) 
    (1, 1)
    (2, 2) 
    (3, 3)

    6) mapValues

  • Mapタイプのデータで値マッピング関数のみを扱う場合は
  • を用いる.
    scala> var maps = Map("A" -> 1, "B" -> 2, "C" -> 3, "D" -> 4, "E" -> 5)
    scala> maps.mapValues(x => x*x).foreach(x => x match { case (k, v) => printf("key: %s, value: %s\n", k, v) })	// value 제곱
    key: E, value: 25
    key: A, value: 1
    key: B, value: 4
    key: C, value: 9
    key: D, value: 16
    
    scala> var maps = Map("A" -> List(1, 2, 3), "B" -> List(4, 5, 6), "C" -> List(7, 8, 9))
    scala> maps.mapValues(_.sum).foreach({ case (k, v) => printf("key: %s, value: %s\n", k, v) })	// value sum
    key: A, value: 6
    key: B, value: 15
    key: C, value: 24

    7) sort

    // sorted
    scala> var list = List(4, 6, 1, 6, 0)
    scala> val l_sort = list.sorted
    scala> val r_sort = list.sorted(Ordering.Int.reverse) 
    scala> println(l_sort)
    List(0, 1, 4, 6, 6)
    scala> println(r_sort)
    List(6, 6, 4, 1, 0)
    
    // sortBy
    scala> val sList = List("aa", "bb", "cc")
    scala> val l_sortBy = sList.sortBy(_.chatAt(0)) 
    scala> println(l_sortBy)
    List(aa, bb, cc)
    
    // sortWith
    scala> val l_sortWith = list.sortWith(_ <= _) 
    scala> val r_sortWith = list.sortWith(_ >= _) 
    scala> println(l_sortWith)
    List(0, 1, 4, 6, 6)
    scala> println(r_sortWith)
    List(6, 6, 4, 1, 0)
    
    // case class 데이터 정렬
    // correct가 같으면 index로 정렬
    scala> case class Person(idx: Int, var correct: Int)
    scala> val persons = Array(Person(1, 3), Person(2, 4), Person(3, 4)) scala> val list = persons.sortWith((x: Person, y: Person) => {
    	|	if(x.correct == y.corrent) 
    	|		x.idx >= y.idx
    	|	x.correct > y.correct
    	| }).toList
    scala> println(list)
    List(Person(2, 4), Person(3, 4), Person(1, 3))