본문 바로가기
개발

개발하면서 자주 썼던 함수 정리 (maxBy, minBy, groupBy, map, reduce, indices, compareTo)

by 준그래머 2021. 3. 5.
반응형

알아두면 유용한 함수들을 정리해 보려 한다.

maxBy, minBy - 배열에서 가장 큰 수와 작은 수를 구할때 사용

fun main() {
    val arrInt = IntArray(10) {0}
    for(i in 0 until arrInt.count() step 1){
        val random:Random = Random()
        arrInt[i] = random.nextInt(100)+1
    }
    println(arrInt.contentToString())

    // val maxNum:Int? = arrInt.maxBy{it}
    val maxNum:Int = arrInt.maxBy{it} ?: -1
    val minNum:Int = arrInt.minBy{it} ?: -1
    println("arrInt에서 가장 큰 수는 ${maxNum}, 가장 작은 수는 ${minNum} 입니다.")
}
  1. val arrInt = IntArray(10) {0} => 배열 arrInt를 10크기만큼 0으로 초기화
  2. for loop => 배열에 랜덤으로 1부터 100까지의 숫자를 넣음
  3. maxBy{it}, minBy{it}을 사용해 배열에서 가장 큰 수, 작은 수를 찾아 각 각의 변수에 입력
  4. 각 각의 변수에 null 값이 들어갈 수 있으므로 ?: 엘비스 연산 또는 타입 뒤에?를 입력하여 null pointer 에러를 방지

 

groupBy - 하나의 속성으로 다른 속성들을 그룹으로 만들어 줄 때 사용, map -

data class Person(val name: String, val age: Int, val gender: String)

fun main() {

    val personList = arrayListOf<Person>(
        Person("Jenny", 24, "female"), Person("Matthew", 55, "male"),
        Person("Jessica", 31, "female"), Person("Jon", 30, "male"),
        Person("cyndi", 40, "female"), Person("Sam", 36, "male"),
        Person("Paul", 22, "male")
    )

    val genderGroup: Map<String, List<Person>> = personList.groupBy { it.gender }
    println(genderGroup)
    
    val groupValue:Collection<List<Person>> = genderGroup.values
    println(groupValue)
    
    val mapGroup:List<Int> = genderGroup.values.map { it.size }
    println(mapGroup)
}
  1. data class Person(val name: String, val age: Int, val gender: String) => data class Person을 생성
  2. personList를 생성
  3. val genderGroup: Map<String, List<Person>> = personList.groupBy { it.gender }
    • genderGroup 변수에 gender로 그루핑된 Map을 반환 Map의 Value 값은 List<Person> 값이다.
  4. val groupValue:Collection<List<Person>> = genderGroup.values => Collection으로 치환해 주기 위해 genderGroup.values를 사용
  5. 5. val mapGroup:List<Int> = genderGroup.values.map { it.size } => groupValue 값으로 각 리스트들의 사이즈를 구해서 리스트로 반환

 

reduce - 배열안에 수를 순차적으로 연산할때 사용

fun main(){
    val arr:ArrayList<Int> = arrayListOf(1,4,2,3)
    var result:Int
    result = arr.reduce{total, element -> element * total} // reduce(Int::times)와 같다
    println(result)
    result = arr.reduce(Int::minus)
    println(result)
}

reduce는 소괄호()를 이용한 방법과 중괄호{}를 이용한 두 가지 방법으로 사용할 수 있다.

3-1. () 소괄호 이용

형식: arr.reduce(type::operator)

operator 기능 예시 결과
plus 더하기 println(arr.reduce(Int::plus)) 10
minus 빼기 println(arr.reduce(Int::minus)) -8
times 곱하기 println(arr.reduce(Int::times)) 24
div 나누기 println(arr.reduce(Int::div)) 0
rem 나머지 println(arr.reduce(Int::rem)) 1

배열 안에 있는 모든 수를 인덱스 순서대로 계산해 준다.

ex) plus => 1 + 4 + 2 + 3 == 10

minus => 1 - 4 - 2 - 3 == -8

times => 1 * 4 * 2 * 3 == 24

div => 1 / 4 / 2 / 3 == 0

rem => 1 % 4 % 2 % 3 == 1

 

3-2. {}중괄호 이용

형식: arr.reduce{total, element -> element operator total}

중괄호 안에 "total, element -> element + total"은 total += element와 같다고 보면 된다. total은 값이 계속 저장될 변수, element는 배열에 들어 있는 수를 순차적으로 불러올 때 사용하는 변수다. 이 변수의 이름은 정해져 있는 것이 아니기에 자유롭게 정해도 상관없다. 다만 operator에 따라 연산이 달라지기 때문에 적절한 연산자를 넣어줘야 한다.

ex) ArrayList. reduce{total, element -> element + total} == ArrayList.reduce(Int::plus)

 

 

 

indices - 배열의 인덱스 값을 가져올 때 사용

val arr = arrayListOf(1,4,2,3) 이 존재

fun main(){
    val arr:ArrayList<Int> = arrayListOf(1,4,2,3)
    val max = arr.max()
    val min = arr.min()
    println(arr.indices)  // 0..3이 출력됨
    println("배열에서 가장 큰 수는 ${max}이고 ${arr.indices.find { i -> arr[i] == max }}인덱스 값이다.")
    println("배열에서 가장 작은 수는 ${min}이고 ${arr.indices.find { i -> arr[i] == min }}인덱스 값이다.")
}

indices와 find결합해서 사용하면 배열에서 가장 큰 수와 작은 수의 "위치"를 쉽게 찾을 수 있다.

 

 

 

compareTo()

fun main() {
    // str1.compareTo("str2") 에서 str1 > str2 인 경우 알파벳 순서를 기준으로 str1 - str2의 결과 값인 Int 타입의 변수가 나온다.

    // str1이 더 큰 경우
    println("b".compareTo("a")) // b가 a보다 1 더 크다
    println("c".compareTo("a")) // c가 a보다 2 더 크다
    println("d".compareTo("a")) // d가 a보다 3 더 크다

    // str1이 더 작은 경우
    println("a".compareTo("e")) // a가 e보다 4 더 작다
    println("a".compareTo("f")) // a가 f보다 5 더 작다
    println("a".compareTo("g")) // a가 g보다 6 더 작다
    // str1이 같은 경우
    println("a".compareTo("a")) // a는 a와 같다
}

// ===========결과 값===========
//  1
//  2
//  3
//  -4
//  -5
//  -6
//  0

compareTo()는 String값 끼리 비교할 때 사용하면 좋다. 특히 리스트를 이름 순으로 정렬할 때 사용하면 편하게 정렬할 수 있다.