Filter and filterNot in Kotlin - Time & Space Complexity
When we use filter or filterNot in Kotlin, we want to keep or remove items from a list based on a rule.
We ask: How does the time to do this change when the list gets bigger?
Analyze the time complexity of the following code snippet.
val numbers = listOf(1, 2, 3, 4, 5, 6)
val evenNumbers = numbers.filter { it % 2 == 0 }
val oddNumbers = numbers.filterNot { it % 2 == 0 }
This code creates a list of numbers, then makes two new lists: one with even numbers and one with odd numbers.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Checking each item in the list once to see if it matches the condition.
- How many times: Once for each item in the list (one pass per filter/filterNot call).
Each item in the list is checked once per filter call, so the work grows as the list grows.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 checks per filter call |
| 100 | About 100 checks per filter call |
| 1000 | About 1000 checks per filter call |
Pattern observation: The number of checks grows directly with the size of the list.
Time Complexity: O(n)
This means the time to filter grows in a straight line as the list gets bigger.
[X] Wrong: "filter and filterNot are instant no matter how big the list is."
[OK] Correct: Each item must be checked, so bigger lists take more time.
Understanding how filtering scales helps you write clear and efficient code, a skill that shows you think about how programs work in real life.
"What if we combined filter and filterNot into one pass? How would the time complexity change?"
Practice
filter function do in Kotlin collections?Solution
Step 1: Understand the purpose of
Thefilterfilterfunction selects elements that satisfy a given condition (true).Step 2: Compare with other options
Options B and D describe different operations, and C describesfilterNot, notfilter.Final Answer:
Keeps items where the condition is true -> Option DQuick Check:
filter= keep true items [OK]
- Confusing filter with filterNot
- Thinking filter removes all items
- Mixing filter with sorting functions
numbers in Kotlin?Solution
Step 1: Identify the condition for even numbers
Even numbers satisfyit % 2 == 0.Step 2: Choose correct filter syntax
filterkeeps items where condition is true, sonumbers.filter { it % 2 == 0 }keeps even numbers.Final Answer:
numbers.filter { it % 2 == 0 } -> Option CQuick Check:
filter with even condition = numbers.filter { it % 2 == 0 } [OK]
- Using filterNot instead of filter
- Using division instead of modulo
- Confusing condition signs (== vs !=)
val nums = listOf(1, 2, 3, 4, 5)
val result = nums.filterNot { it > 3 }
println(result)Solution
Step 1: Understand filterNot condition
filterNot { it > 3 }keeps items whereit > 3is false, so items ≤ 3.Step 2: Apply condition to list
Numbers 1, 2, 3 are ≤ 3, so they are kept; 4 and 5 are removed.Final Answer:
[1, 2, 3] -> Option AQuick Check:
filterNot > 3 = keep ≤ 3 [OK]
- Confusing filterNot with filter
- Including numbers greater than 3
- Expecting empty list output
val numbers = listOf(1, 2, 3, 4, 5)
val evens = numbers.filterNot { it % 2 == 0 }
println(evens)Solution
Step 1: Analyze the filterNot condition
filterNot { it % 2 == 0 }keeps items whereit % 2 == 0is false, so it keeps odd numbers.Step 2: Check intended output
The code tries to get even numbers but actually keeps odd numbers, so logic is reversed.Final Answer:
It incorrectly keeps odd numbers instead of even -> Option BQuick Check:
filterNot with even condition keeps odd [OK]
- Using filterNot instead of filter for positive condition
- Assuming filterNot removes items instead of keeping false
- Misreading modulo condition
val words = listOf("apple", "banana", "", "cherry", ""), which Kotlin expression returns a list of only the non-empty words using filter and filterNot correctly?Solution
Step 1: Identify condition for non-empty strings
Non-empty strings satisfyit.isNotEmpty().Step 2: Choose correct filter usage
filterkeeps items where condition is true, sowords.filter { it.isNotEmpty() }returns only non-empty words.Final Answer:
words.filter { it.isNotEmpty() } -> Option AQuick Check:
filter with isNotEmpty = keep non-empty [OK]
- Using filterNot with isNotEmpty to keep empty strings
- Confusing isEmpty and isNotEmpty
- Expecting filterNot to remove empty strings
Ready to prove it?
Pass the test and this pattern moves unknown
