[코틀린쿡북] 5.컬렉션

나고수·2021년 10월 19일
0

kotlin

목록 보기
8/10

5.1 배열 다루기

Array 클래스에는 public 생성자가 하나만 있다. 이 생성자는 다음의 두 인자를 받는다.
Int 타입의 size , init 즉 (Int) -> T 타입의 람다
Array 클래스 생성자의 두 번째 인자인 람다는 배열을 생성 할 때 인덱스마다 호출된다.

처음 5개의 정수를 제곱한 값의 문자열 배열을 생성하는 코드

val squares = Array(5){i->(i*i).toString()}

Array의 확장함수(indices,withIndex)

indice - 배열의 인덱스 값을 알려줌

val strings = arrayOf("hi","it's","sunday")
val indices = strings.indices
//asserThat(indices, contains(0,1,2)

withIndex - for문을 돌 때 인덱스도 같이 활용하고 싶음

val strings = arrayOf("hi","it's","sunday")
for((index,value) in strings.withIndex){
println("Index $index Value $value")}
//Index 0 Value hi
//Index 1 Value it's
//Index 2 Value sunday

5.2 컬렉션 생성하기

listOf, setOf, mapOf

5.4 컬렉션에서 맵 만들기

associateWith - 키 리스트가 있을 때 각각의 키와 생성한 값을 연관시켜서 맵을 만들 수 있음

val keys = 'a'...'f'
val map = keys.associateWith{(it.toString().repeat(5).capitalize()}
println(map)
//{a=Aaaaa,b=Bbbbb,c=Ccccc,d=Ddddd,e=Eeeee}

5.5 컬렉션이 빈 경우 기본값 리턴하기

filter

data class Product (val name : String,
		    var price : Double,
                    var onSlae : Boolean = false)       
//판매중인 상품의 이름 얻기
fun nameOfProductOnSale(products:List<Product>=
    products.filter{it.onSale}
    	.map{it.name}
    	.joinToString(separator=", ")
//판매중인 상품이 없을 때 (it.onSale이 모두 false 일 때)
//위의 예제는 빈 문자열을 반환함
//ifEmpty를 사용하면 특정 문자열을 리턴
fun onSaleProducts_ifEmptyCollection(products:List<Product>)=
	products.filter{it.onSale}
  		.map{it.name}
      		.ifEmpty{listOf("none")}
       		.joinToString(separator = ", ")
onSaleProducts_ifEmptyString(products:List<Product>)=
  	products.filter{it.onSale}
    		.map{it.name}
          	.joinToString(separator = ", ")
          	.ifEmpty{"none"}

5.6 주어진 범위로 값 제한하기

coerceIn - 값이 범위 안에 있으면 해당 값을, 값이 범위 안에 없으면 경계값을 리턴

val range = 3..8
5.coerceIn(range) //5
1.coerceIn(range) // 3
9.coerceIn(range) //8
5.coreceIn(3,6) //5

5.7 컬렉션을 윈도우로 처리하기

chunked

val range=0..10
range.chunked(3) 
//return List<List<Int>>
//[[0,1,2],[3,4,5],[6,7,8],[9,10]]
range.chunked(3){it.sum()}
//listOf(3,12,21,19)
ranve.chunked(3){it.average()}
//listOf(1.0,4.0,7.0,9,5)

windowed

  • windowed(size, size, partialWindows = false)
    -size : 각 윈도우에 포함될 원소의 개수
    -size : 각 단계마다 전진할 원소의 개수 (기본 1개)
    -partialWindows : 나뉘어 있는 마지막 부분이 윈도우에 필요한 만큼의 원소 개수를 갖지 못한 경우, 해당 부분을 그대로 유지할지 여부를 알려주는 불리언 값 (기본 flase)
  • chunked 함수는 windowed(chunked인자, chunked인자, true) 인 특별한 case의 windowed 함수다.
val range = 0..10
range.windowed(3,3)
//[[0,1,2],[3,4,5],[6,7,8]]
//한 리스트에 3개씩, 3만큼 전진
//마지막 윈도우는 3개가 아님. partialWindows 기본값 false 이기 때문에 출력되지 않음
range.windowed(3,3){it.average()}
//[1.0,4.0,7.0]
range.windowed(3,1)
//[[0,1,2],[1,2,3],[2,3,4],[3,4,5],[4,5,6],[6,7,8],[7,8,9],[8,9,10]]
//한 윈도우에 3개씩, 1만큼 전진
//[9,10],[10] 은 3개가 들어있지 않고 partialWindows 기본값 false 이기 때문에 출력되지 않음
range.windowed(3,1){it.average()}
//[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]

5.8 리스트 구조 분해하기

componentN - 생성된 리스트의 처음 다섯 원소가 자신과 같은 값과 같은 이름의 변수에 할당된다. 리스트의 처음 5개 원소만 적용된다.

val list = listOf("a","b","c","d","e","f","g")
val (a,b,c,d,e) = list
println("$a,$b,$c,$d,$e")
//"a b c d e"

5.9 다수의 속성으로 정렬하기

sortedWith, comparedBy

data class Golfer(val score : Int, val first : String, val last : String)
val golfers = listOf(
	Golfer(70,"eunji", "park"),
    Golfer(70,"eunji", "kim"),
    Golfer(78,"jihong", "han"),
    Golfer(78,"hanmo", "kim"))
//점수로 정렬 - 점수가 같으면 성으로 정렬 - 성이 같으면 이름으로 정렬
//오름차순으로 정렬됨
golfers.soredWith(
	comparedBy({it.socre},{it.last},{it.first})
   )
//comparator과 thenBy 함수를 사용해 정렬하기
val comparator = compareBy<Golfer>(Golfer::score)
	.thenBy(Golfer::last)
 	.thenBy(Golfer::first)
golfers.sortedWith(comparator)

5.11 타입으로 컬렉션을 필터링하기

filterIsInstance, filterIsInstanceTo

val list = listOf("a",LocalDate.now(),3,1,4,"b")
val strings = list.fiter{it is String}
for (s in strings){
	//s.length //컴파일되지 않음
}
//필터링 연산은 작동하지만, strings의 타입이 List<Any> 이기 때문에 s.length가 작동하지 않는다
//filterIsInstance 사용
val list = listOf("a",LocalDate.now(),3,1,4,"b")
val all = list.filterIsInstance<Any>()
//list
val strings = list.filterIsInstance<String>()
//"a","b"
val ints = list.filterIsInstance<Int>()
//1,3,4
val dates = list.filterIsInstance<LocalDate::Class.java>()
//Localdate.now()
profile
되고싶다

0개의 댓글