'2016/09/12'에 해당되는 글 2건

  1. 2016.09.12 [scala] Array 예시
  2. 2016.09.12 [scala] zip, unzip 예시

[scala] Array 예시

scala 2016. 9. 12. 18:53


scala의 Array 예제이다. 


val array1 = Array(1,2,3)
val array2 = Array(3,4,5)


+: 연산자를 사용하면 재미있는 결과를 볼 수 있다. 앞과 뒤에 쉽게 붙일 수 있다. c++ 연산자 오버로딩과 비슷하게 사용할 수 있다. 

println(-1 +: Array(1,2,3) :+ 4 mkString " ")

결과는 다음과 같다. 


-1 1 2 3 4



Array 객체의 내용을 출력하려면, mkString 메소드를 사용해야 엘리먼트를 볼 수 있다. 그냥 출력하면 내부에서 관리하는 객체 이름으로 보인다. 

++ 연산자는 Array 객체를 서로 합친다. 


//println(array1 + array2) //compile error
println(array1 ++ array2) //내부 객체 이름 출력
println(array1 ++ array2 mkString " ")


결과는 다음과 같다.


[I@3567135c

1 2 3 3 4 5



intersect와 union 예제이다. union 메소드 결과와 Array.concat 메소드 결과는 동일하다.


println(array1 intersect array2 mkString " ")
println(array1 union array2 mkString " ")
println(Array.concat(array1, array2) mkString " ")

결과는 다음과 같다.


3

1 2 3 3 4 5

1 2 3 3 4 5



두 배열의 엘리먼트를 합치면서 유일한 값만 뽑으려면 distinct 메소드를 사용한다.

A-B 집합연산에 해당하는 diff메소드를 사용할 수도 있다.

println((array1 union array2 distinct) mkString " ")
println(array1 diff array2 mkString " ")


결과는 다음과 같다.


1 2 3 4 5
1 2



배열의 엘리먼트의 순서를 거꾸로 하려면 reverse 메소드를 사용한다.


println((array1.reverse).mkString(" "))

결과는 다음과 같다.


3 2 1




range를 array로 변환할 수도 있다.

println((0 to 3).toArray.mkString(" "))

결과는 다음과 같다.

0 1 2 3





Array.fill 메소드는 c의 memset과 같은 느낌으로 초기화할 수 있는 메소드이다. 

Byte 타입으로 3개의 엘리먼트를 가진 Array를 0으로,

Byte 타입으로 5개의 엘리먼트를 가진 Array를 1로 초기화하려면 다음과 같이 호출할 수 있다.

println(Array.fill[Byte](3)(0) mkString " ")
println(Array.fill[Byte](5)(1) mkString " ")

결과는 다음과 같다.

0 0 0

1 1 1 1 1




만약 5개의 엘리먼트를 Int 타입으로 랜덤하게 생성하려면 다음을 호출한다.



println(Array.fill[Int](5){scala.util.Random.nextInt(5)} mkString " ")

랜덤 결과 값은 다음과 같다.


4 0 2 0 2






Array.fill 메소드로 2*2 배열을 초기화할 수 있다. 결과값을 보려면, mkString에 .deep를 추가한다. 

deep.mkString을 사용하니 내용을 출력할 수 있었다.

val array = Array.fill[Int](2,2){scala.util.Random.nextInt(5)}
println(array mkString " ")
println(array.deep.mkString(" "))


결과는 다음과 같다.


[I@73f792cf [I@2ed94a8b

Array(2, 2) Array(2, 3)





Array에 foreach를 사용할 수 있다. 

val array = Array.fill[Int](5){scala.util.Random.nextInt(5)}
var sum = 0
array.foreach(sum += _)
println(sum)

array foreach(i => println(i))

array foreach{
case i => println(i)
}


Posted by '김용환'
,

[scala] zip, unzip 예시

scala 2016. 9. 12. 11:57


zip 메소드는 리스트를 순환하면서 리스트 튜플을 만든다. (내부적으로 iterator 객체를 포함할 때만 동작한다)


zipWithIndex는 따로 List를 주지 않아도 자동으로 0부터 시작하는 list와 합치도록 해준다. 


Stream from 0 은 0부터 시작하는 리스트를 리턴한다. 


unzip은 만어진 리스트 튜플을 다시 리스트 객체로 쪼개주는 역할을 한다. unzip._1은 다시 원래의 list로 리턴하는 메소드이다. 



val list = List(1,2,3,4,5)
println(list.zipWithIndex)
println(list.zip(Stream from 0))
println(list.zip(Stream from 0).unzip._1)


결과는 다음과 같다.


List((1,0), (2,1), (3,2), (4,3), (5,4))

List((1,0), (2,1), (3,2), (4,3), (5,4))

List(1, 2, 3, 4, 5)



문자열도 동일하게 동작한다. 

scala에서는 메소드르 사용할 때 꼭 내부 함수를 의미하는 .나 괄호를 쓰지 않아도 되는 경우가 있다. 마치 수학 연산 같은 느낌을 주기 위해 다음과 같이 List zip List 형태로 쓸 수 있다.


zip, unzip, toMap 메소드 예시를 실행해 본다.

val zipped = List("A", "B") zip List("C", "D")
println(zipped)
println(zipped.unzip)
println(zipped.toMap)


결과는 다음과 같다.


List((A,C), (B,D))

(List(A, B),List(C, D))

Map(A -> C, B -> D)




만약 엘리먼트가 하나가 더 큰 상황에서 zip메소드를 호출하면 긴 엘리먼트 쪽 데이터는 zip 메소드에서 사용하지 않는다.


val zips = List("A", "B") zip List("C")
println(zips)


결과는 다음과 같다.


List((A,C))




두 개 뿐 아니라 세 개의 튜플을 가지는 리스트 객체를 생성할 수도 있다. 


println((List(1,2,3,4,5), List(0,1,2,3,4)).zipped.toList)
println((List(1,2,3,4,5), List(0,1,2,3,4), List(10,11,12,13,14)).zipped.toList)


결과는 다음과 같다. 

List((1,0), (2,1), (3,2), (4,3), (5,4))

List((1,0,10), (2,1,11), (3,2,12), (4,3,13), (5,4,14))


Posted by '김용환'
,