문제

Learn about [association]. Implement the following functions using [associateBy]

  • Build a map from the customer name to the customer
  • Build a map from the customer to their city
  • Build a map from the customer name to their city
val list = listOf("abc", "cdef")

list.associateBy { it.first() } ==
        mapOf('a' to "abc", 'c' to "cdef")

list.associateWith { it.length } ==
        mapOf("abc" to 3, "cdef" to 4)

list.associate { it.first() to it.length } ==
        mapOf('a' to 3, 'c' to 4)

Task.kt

// Build a map from the customer name to the customer
fun Shop.nameToCustomerMap(): Map<String, Customer> =
        TODO()

// Build a map from the customer to their city
fun Shop.customerToCityMap(): Map<Customer, City> =
        TODO()

// Build a map from the customer name to their city
fun Shop.customerNameToCityMap(): Map<String, City> =
        TODO()

Shop.kt

data class Shop(val name: String, val customers: List<Customer>)

data class Customer(val name: String, val city: City, val orders: List<Order>) {
    override fun toString() = "$name from ${city.name}"
}

data class Order(val products: List<Product>, val isDelivered: Boolean)

data class Product(val name: String, val price: Double) {
    override fun toString() = "'$name' for $price"
}

data class City(val name: String) {
    override fun toString() = name
}

// Build a map from the customer name to the customer
fun Shop.nameToCustomerMap(): Map<String, Customer> =
        customers.associateBy { it.name }

// Build a map from the customer to their city
fun Shop.customerToCityMap(): Map<Customer, City> =
        customers.associateWith { it.city }

// Build a map from the customer name to their city
fun Shop.customerNameToCityMap(): Map<String, City> =
        customers.associate { it.name to it.city }

풀이

associateBy, associateWith, associate 함수를 사용하여 Map으로 변환하는 문제이다.

요구사항

  1. 고객 이름을 키로 하고, 고객을 값으로 하는 Map 생성
  2. 고객을 키로 하고, 고객들의 도시를 값으로 하는 Map 생성
  3. 고객 이름을 키로 하고, 고객들의 도시를 값으로 하는 Map 생성

먼저 각 함수에 대해서 간단하게 알아보았다.

  • associateBy: 함수에 전달하는 요소를 Map 의 키로 사용하고, 리스트의 값은 값으로 변환한다.
    • 문제에서 주어진 예시 코드를 살펴보면,
      list.associateBy { it.first() }는 각 요소의 첫번째 글자를 키로 하고, 요소 자체를 값으로 만든다.
  • associateWith: 리스트의 각 요소를 기준으로 함수의 전달하는 요소로 Map의 값을 생성하고, 리스트의 요소를 키로 저장한다.
    • 문제에서 주어진 예시 코드를 살펴보면,
      list.associateWith { it.length }는 각 요소를 키로 하고, 길이를 값으로 가진다.
  • associate: 리스트의 각 요소에서 키와 값을 직접 생성하여 Map을 만든다.
    • 문제에서 주어진 예시 코드를 살펴보면,
      list.associate { it.first() to it.length }는 요소의 첫 번째 글자를 키로, 요소의 길이를 값으로 만든다.

요구사항 1

  • 고객 이름을 키로 하고, 고객을 값으로 : associateBy
    • Shop 클래스는 customers를 List로 가지고 있다.
      그렇기 때문에 customers 리스트의 이름을 전달하게 되면 값으로 고객 리스트가 들어간 Map이 만들어진다.

요구사항 2

  • 고객을 키로 하고, 고객들의 도시를 값으로 : associateWith
    • 고객들의 도시를 값으로 가지게 하기 위해서는 associateWith 함수를 이용해서 값으로 사용할 요소를 전달해야 한다.

요구사항 3

  • 고객 이름을 키로 하고, 고객들의 도시를 값으로 : associate
    • 각 요소에서 키, 값을 직접 이름과 도시로 지정하라고 하였기 때문에 associate 함수를 이용해서 전달해야 한다.
profile
개발하는 다람쥐

0개의 댓글