Introduction

Welcome to our Kotlin data structures revision! Today, we will delve deeply into Kotlin Maps. Just like a library card catalog, maps enable you to quickly locate the information you need by referring to a label (key). They are vital in Kotlin for efficiently accessing values using keys, as well as for key insertion and deletion. Let's explore Kotlin's Map and MutableMap for a clearer understanding of these concepts.

Kotlin Maps

Maps in Kotlin are a type of data structure that hold data as key-value pairs. They provide an efficient way to store and retrieve information based on unique keys. Each key in a map is associated with exactly one value. You can think of a map like a dictionary where you look up a word (key) to get its definition (value). Keys are unique, but values don't have to be.

Maps can be either mutable or immutable in Kotlin. Immutable maps are read-only, meaning you cannot add, remove, or modify entries once they're created. Mutable maps allow for dynamic changes, such as adding, updating, and removing key-value pairs, making them highly flexible for situations where the dataset needs to be manipulated frequently.

Here's a small example of an immutable map:

Now, let's look at an example of a PhoneBook class using a MutableMap to store contacts, allowing for dynamic changes:

Explanation

  1. private val contacts: MutableMap<String, String>: This declares a MutableMap to store contact names (keys) and their corresponding phone numbers (values). As a mutable map, it allows for adding, updating, and removing entries.

  2. addContact(name: String, phoneNumber: String):

    • Adds or updates a contact in the contacts map.
    • If a contact with the given name already exists, their phone number is updated. Otherwise, a new key-value pair is added.
  3. getPhoneNumber(name: String): String?:

    • Retrieves the phone number for a given contact name.
    • If the contact is not found, it returns null.
  4. hasContact(name: String): Boolean:

    • Uses containsKey to check if the contact name exists in the contacts map.
    • Returns true if the contact exists, otherwise false.
  5. showContact(name: String): String:

    • Uses the get method to retrieve a contact's phone number.
    • Leverages the Elvis operator to return "Contact not found" if the contact does not exist.
Operations in Maps

Kotlin's MutableMap provides a variety of operations for manipulating data, such as setting, getting, and deleting key-value pairs. Understanding these operations is crucial for efficient data handling in Kotlin.

To add or update entries in a MutableMap, you directly assign a value to a key. If the key exists, the value is updated; if not, a new key-value pair is added, allowing dynamic updates and additions to the map.

The get operation is used to retrieve the value associated with a specific key. It offers a straightforward way to access values, returning null if the key does not exist.

Deleting an entry is done using the remove function followed by the key. This operation removes the specified key-value pair from the MutableMap, which is essential for actively managing the contents.

Let's see how these operations work in the context of a Task Manager class:

This example showcases how to leverage map operations in Kotlin to effectively manage data by adding, updating, retrieving, and deleting entries through a simulated Task Manager application.

Looping Through Maps

Kotlin provides an elegant way to loop through maps using a for loop. You can iterate through keys, values, or both simultaneously.

Let's explore this in our Task Manager example:

In this case, iterating over tasks.keys provides all keys in our map, allowing us to print all tasks in our task manager. You can also use tasks.values to get all values in the map and tasks.entries to get all items as key-value pairs.

Nesting with Maps

Nesting in maps involves storing maps within another map. It's useful when associating multiple pieces of information with a key. Let's see how this works in a Student Database example. Here, we will iterate through map entries for displaying students and their subject grades.

Hands-on Example

Let's shift our focus to a more interactive and familiar scenario: managing a shopping cart in an online store. This hands-on example will demonstrate how maps can be used to map product names to their quantities in a shopping cart. You will learn how to add products, update quantities, and retrieve the total number of items in the cart.

Here’s how you can implement and manipulate a shopping cart using a Kotlin MutableMap:

In the ShoppingCart class, the getOrDefault function is used in the addProduct method to handle the addition or updating of products in the cart. Here's how it works:

In this line of code, cart.getOrDefault(productName, 0) is used to retrieve the current quantity of a product in the cart. If the product is not already present in the cart, getOrDefault will return the specified default value, which is 0 in this case.

This ensures that when you add a product that is not already in the cart, it starts with a quantity of zero, and then the specified quantity is added to it. If the product already exists, its current quantity is retrieved and the new quantity is added to it. This effectively updates the quantity in the cart, ensuring that all additions account for any existing amount of the product.

This example showcases the practical application of maps to manage a dynamic dataset, such as an online shopping cart. By using product names as keys and their quantities as values, we achieve efficient and flexible data manipulation.

Lesson Summary and Practice

Well done! Today, we delved into Kotlin's Map and MutableMap and explored various operations on maps. We now invite you to get hands-on experience with the upcoming practice exercises. To master these concepts and hone your Kotlin map skills, practice is key. Happy learning!

Sign up
Join the 1M+ learners on CodeSignal
Be a part of our community of 1M+ users who develop and demonstrate their skills on CodeSignal