코틀린 문법 - Collections(2) operations

kimgwon·2024년 10월 7일

Kotlin

목록 보기
4/19

컬렉션 연산의 유형

  • 멤버 함수 : 특정 컬렉션 타입에 필수적인 함수
  • 확장 함수 : 여러 컬렉션 타입에 적용될 수 있는 함수

길이 : size

println(numbers.size) // 리스트 길이: 5

요소 개수 세기 : count()

println(numbers.count { it > 2 }) // 2보다 큰 요소의 개수: 3

요소 포함 여부 : in, contains(), containsAll(), containsKey()

println("zero" in numbers) // false
println(numbers.contains("four")) // "four"가 포함되어 있는지: true

println(numbers.containsAll(listOf("four", "two"))) // true
println(numbers.containsAll(listOf("one", "zero"))) // false

println(ageMap.containsKey("Bob")) // "Bob"이 키로 포함되어 있는지: true

빈 컬렉션인지 확인 : isEmpty(), isNotEmpty()

val numbers = listOf("one", "two", "three", "four", "five", "six")
println(numbers.isEmpty()) // false
println(numbers.isNotEmpty()) // true

val empty = emptyList<String>()
println(empty.isEmpty()) // true
println(empty.isNotEmpty()) // false

인덱싱 : [], first(), last()

numbers[2] // 인덱스 2의 요소: 3

numbers.first() // 인덱스 0의 요소: 1
numbers.first { it > 3 } // 조건 부합하는 인덱스 0의 요소: 4

numbers.last() // 인덱스 -1의 요소: 5
numbers.last{ it < 4 } // 조건 부합하는 인덱스 -1의 요소: 3

인덱스 반환 : indexOf()

println(numbers.indexOf(4)) // 4의 인덱스: 3

슬라이싱 : slice()

val sliced = numbers.slice(1..3) // 인덱스 1부터 3까지: [2, 3, 4]

집계함수 : minOrNull(), maxOrNull(), average(), sum(), count()

  • minOrNull() : 컬렉션에서 가장 작은 요소 반환. 비어있다면 null 반환
  • maxOrNull() : 컬렉션에서 가장 큰 요소 반환. 비어있다면 null 반환
  • average() : 숫자 컬렉션의 평균값 반환
  • sum() : 숫자 컬렉션의 합계 반환
  • count() : 컬렉션의 요소 개수 반환
val numbers = listOf(6, 42, 10, 4)

println("Count: ${numbers.count()}")       // 4
println("Max: ${numbers.maxOrNull()}")     // 42
println("Min: ${numbers.minOrNull()}")     // 4
println("Average: ${numbers.average()}")   // 15.5
println("Sum: ${numbers.sum()}")           // 62

집계함수 : fold(), reduce()

reduce()와 fold()는 컬렉션의 요소를 순차적으로 연산하여 누적 결과를 반환한다.

  • reduce(): 첫 번째와 두 번째 요소를 첫 단계의 인수로 사용한다.
  • fold(): 초기값을 첫 번째 단계의 누적값으로 사용한다.
val numbers = listOf(1, 2, 3, 4)

val simpleSum = numbers.reduce { sum, element -> sum + element }
println(simpleSum) // 10 (1 + 2 + 3 + 4)

val sumDoubled = numbers.fold(5) { sum, element -> sum + element * 2 }
println(sumDoubled) // 15 (5 + 1 + 2+ 3 + 4)

순회 : Iterator

iterator() 함수를 호출하면 Iterator 객체가 생성되고, 이 객체는 컬렉션의 첫 번째 요소를 가리킨다.
next() 함수는 현재 요소를 반환하고, 다음 요소로 이동한다.
마지막 요소를 지나면 더 이상 요소를 가져올 수 없으며, 다시 순회하려면 새로운 Iterator를 만들어야 한다.

val numbers = listOf("one", "two", "three", "four")
val numbersIterator = numbers.iterator()
while (numbersIterator.hasNext()) {
    println(numbersIterator.next())
    // 출력:
    // one
    // two
    // three
    // four
}

순회 : for

Kotlin의 for 루프는 컬렉션의 Iterator를 암묵적으로 사용한다.

val numbers = listOf("one", "two", "three", "four")
for (item in numbers) {
    println(item)
    // 출력:
    // one
    // two
    // three
    // four
}

for (i in 1..4) print(i) // 1234
for (i in 4 downTo 1) print(i) // 4321
for (i in 0..8 step 2) print(i) // 02468

순회 : forEach

val numbers = listOf("one", "two", "three", "four")
numbers.forEach {
    println(it)
    // 출력:
    // one
    // two
    // three
    // four
}

복사 : toList()

val copiedList = numbers.toList() // 리스트 복사: [1, 2, 3, 4, 5]

정렬 : sorted(), sortedByDescending()

  • compareBy() : Comparator 정의 가능
val sortedList = numbers.sorted() // 정렬된 리스트: [1, 2, 3, 4, 5]
val sortedDescending = numbers.sortedByDescending() // 내림차순으로 정렬된 리스트: [5, 4, 3, 2, 1]


val pairs = listOf(
    Pair("Alice", 30),
    Pair("Bob", 25),
    Pair("Charlie", 35)
)

// 첫 번째 요소(이름) 기준 오름차순 정렬
val sortedByName = pairs.sortedBy { it.first }
println(sortedByName) // [(Alice, 30), (Bob, 25), (Charlie, 35)]

// 두 번째 요소(나이) 기준 오름차순 정렬
val sortedByAge = pairs.sortedBy { it.second }
println(sortedByAge) // [(Bob, 25), (Alice, 30), (Charlie, 35)]

// 두 번째 요소(나이) 기준 내림차순 정렬
val sortedByAgeDescending = pairs.sortedByDescending { it.second }
println(sortedByAgeDescending) // [(Charlie, 35), (Alice, 30), (Bob, 25)]


listOf("aaa", "bb", "c").sortedWith(compareBy { it.length }) // [c, bb, aaa]

뒤집기 : reversed()

val reversedList = numbers.reversed() // 뒤집힌 리스트: [5, 4, 3, 2, 1]

컬렉션 확장 : +, addAll()

val mutableNumbers = mutableListOf(1, 2, 3)

// 새로운 함수 반환
val combined = numbers + listOf(5, 6, 7) // 두 리스트 합치기: [1, 2, 3, 4, 5, 6, 7]

// 기존 함수 변경
mutableNumbers.addAll(listOf(4, 5)) // 리스트 확장: [1, 2, 3, 4, 5]
mutableNumbers += 6 // [1, 2, 3, 4, 5, 6]

요소 추가 : add(), addFirst(), addLast()

mutableNumbers.add(4) // 요소 추가: [10, 2, 3, 4]
mutableNumbers.add(1, 5) // 인덱스 1에 5 삽입: [10, 5, 2, 3, 4]


deque.addFirst(0)               // 앞에 요소 추가: [0, 1, 2, 3]
deque.addLast(4)                // 뒤에 요소 추가: [0, 1, 2, 3, 4]


mutableAgeMap["Charlie"] = 20    // 새로운 키-값 추가: {"Alice" to 30, "Bob" to 25, "Charlie" to 20}
mutableAgeMap.remove("Alice")    // "Alice" 엔트리 제거: {"Bob" to 25, "Charlie" to 20}

요소 제거 : -, remove(), removeFirst(), removeLast()

val numbers = listOf("one", "two", "three", "four")
val mutableNumbers = mutableListOf("one", "two", "three")

// 단일 요소 제거
val minusList = numbers - "two" // [one, three, four]
mutableNumbers -= "two" // [one, three, four]

// 컬렉션의 요소 제거
val minusList2 = numbers - listOf("three", "four") // [one, two]
mutableNumbers.remove(5) // 5 제거: [10, 2, 3, 4, 6, 7]

deque.removeFirst()             // 첫 번째 요소 제거: [1, 2, 3, 4]
deque.removeLast()              // 마지막 요소 제거: [1, 2, 3]

수정

mutableNumbers[0] = 10  // 첫 번째 요소를 10으로 변경: [10, 2, 3]

0개의 댓글