리버스, 리버스, asReveresed에 대해 혼란스럽습니까? 코틀린에서

질문을 풀고 그것에 대해 자세히 알아봅시다.https://chetangupta.net/bbk8/에 원래 게시

안녕하세요, 다른 질문을 가지고 돌아왔습니다. 매우 일반적이고 쉽습니다. 이 작업을 수없이 많이 수행했을 수 있습니다.
질문: 배열이나 문자열을 뒤집는 프로그램을 작성하세요.

Example :
Input1 :  arr[] = {4, 5, 1, 2}
Output : arr[] = {2, 1, 5, 4}


직접 해보십시오 👨🏻‍💻👇🏻:
https://www.geeksforgeeks.org/write-a-program-to-reverse-an-array-or-string/

Kotlin의 표준 라이브러리 솔루션으로 이동하기 전에 수동으로 해결하는 방법을 살펴보겠습니다.

솔루션 1: 추가 공간 확보



여분의 공간을 차지함으로써 다른 목록을 사용하여 목록을 뒤집을 것입니다.

fun main() {
    val input1 = listOf(4, 5, 1, 2)
    println(input1.reverseExtraSpace()) // [2, 1, 5, 4]
}

fun List<Int>.reverseExtraSpace(): List<Int> {
    val result = mutableListOf<Int>()
    for (index in indices) {
        val lastIndex = lastIndex - index
        result.add(get(lastIndex))
    }
    return result
}


볼라! 많은 코드로 배열을 뒤집었습니다!
이 접근 방식을 분석하고 장단점을 살펴보겠습니다.

장점 :


  • 확장 기능입니다. 즉, 할당된 수신기에서만 볼 수 있습니다. 여기서 수신기는 목록이고 reverseExtraSpace 기능은 이 기능에서만 볼 수 있습니다. (제네릭을 사용하여 보다 일반화할 수 있음)
  • 입력 목록이 수정되지 않습니다. 즉 원래 목록에서 변경한 경우 되돌린 후 실수로 반전된 목록에 반영됩니다.
  • 변형은 확장의 본문에만 있는 범위이며 반환 유형에서 읽기 전용 목록을 가져옵니다.
    대체로 이 코드는 매우 안전하고 건전합니다.

  • 단점:


  • 전체 목록을 반복해야 합니다.
  • 반전된 목록을 저장하기 위해 더 많은 공간을 차지합니다.

  • …허.. 이 접근법이 좋지 않다는 것은 무엇을 의미합니까? 면접관은 공간 최적화를 요청할 것입니다.

    우리가 인터뷰 환경에 있을 때 우리는 그들에게 당신의 두뇌를 사용하는 A-Game을 보여줘야 하지만, 그들에게 설명하고 정확하고 예측 가능한 행동을 위한 코드를 작성하는 것이 약간의 최적화보다 훨씬 더 중요합니다. 애플리케이션의 유용성에 영향을 미치지 않는 한 코드 평가 메트릭의 마지막 부분이어야 합니다.

    그러나 그가 동의하지 않고 더 나은 해결책을 주장한다면…

    솔루션 2: 여분의 공간을 차지하지 않음



    따라서 배열을 만들지 않습니다.

    fun main() {
        val input1 = listOf(4, 5, 1, 2)
        println(input1.reverseNoExtraSpace()) // [2, 1, 5, 4]
    }
    fun List<Int>.reverseNoExtraSpace(): List<Int> = with(this.toMutableList()) {
        val mid = lastIndex / 2
        (0..mid).forEach {
            val firstIndex = it
            val lastIndex = lastIndex - it
            val first = get(firstIndex)
            val last = get(lastIndex)
            //swap
            set(firstIndex, last)
            set(lastIndex, first)
        }
        this
    }
    


    완료! 추가 공간을 사용하지 않고.

    구현을 엉망으로 만들고 솔루션 1의 장점을 잃는 것은 매우 쉽습니다. 어떤 종류의 데이터를 입력으로 보내고 출력으로 노출하고 변형이 허용되어야 하는 범위를 이해하는 것이 중요합니다.

    Note in Kotlin that when we convert list to a Mutable list isn't a typecast, a new mutable list with the same items gets created. To remove that cost you need to take MutableList instead of List from the beginning.
    
    Or you can use IntArray if you like.
    


    솔루션 3 : 표준 라이브러리 기능 사용



    이제 멋진 부분은 이러한 솔루션을 통해 후드 역방향 작동에 대한 노하우를 이미 가지고 있다는 것입니다. Kotlin 표준 라이브러리에서는 솔루션 2를 기반으로 사용합니다.
    List 컬렉션에는 목록의 순서를 뒤집는 두 가지 방법이 있습니다.
  • 반전 — https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/reversed.html
  • asReversed — https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/as-reversed.html

  • 둘 다 역순으로 목록을 반환하지만 역순을 사용하면 원래 목록에서 수행된 모든 변경 사항이 역순 목록에 반영되지 않습니다. 따라서 변경 가능한 컬렉션과 함께 사용하는 것이 더 안전합니다.

    예시 :

    val list = mutableListOf(1,2,3,4) // mutable list
    val reversed   = list.reversed()
    val asReversed = list.asReversed()
    println(list) // [1,2,3,4]
    println(reversed) // [4,3,2,1]
    println(asReversed) // [4,3,2,1]
    list.set(1,9)
    println(list) // [1,9,3,4]
    println(reversed) // [4,3,2,1]
    println(asReversed) // [4,3,9,1]
    


    참고 — 읽기 전용 컬렉션인 목록을 사용하는 경우 이 문제가 전혀 발생하지 않습니다. 목록을 변경 가능한 목록으로 변환하지 않는 한 목록을 수정할 수 없으며, 변환을 시도하더라도 완전히 새로운 목록이 되기 때문에 반전한 목록이 아닙니다. 따라서 reversed 및 asReversed를 사용하는 List는 비슷합니다.
    그러나 일반적으로 asReversed보다 reversed를 사용하는 것이 좋습니다.

    보너스 파트 - 리버스



    Mutable-List에 대해 말하자면, 추가적인 반전 기능이 있습니다 — https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/reverse.html
    그것은 다음을 의미하는 목록의 요소를 제자리에서 뒤집습니다.

    val input = mutableListOf(1,2,3,4,5)
    println(input) // [1, 2, 3, 4, 5]
    input.reverse() // retuns Unit not a list i.e. updates the exisiting list
    println(input) // [5, 4, 3, 2, 1]
    


    즉, 현명하게 사용하십시오.

    결론 💆🏻‍♀️



    그게 다야! 이것이 누군가를 돕기를 바랍니다.
    유익한 정보가 되셨기를 바라며 피드백이나 게시 요청이 있거나 내 메일링 리스트 양식을 구독하고 싶다면 아래에 있습니다.

    https://chetangupta.net/updates/

    다음 시간까지 감사의 표시로 박수를 치는 것을 고려하십시오. 행복한 해킹! 👩‍💻

    좋은 웹페이지 즐겨찾기