From 84e801ed016b6abc0558270ed2ef4b3074b4256b Mon Sep 17 00:00:00 2001 From: Joren Date: Tue, 30 Apr 2024 02:02:39 +0200 Subject: [PATCH] Add bin search --- .../ui/viewmodels/PokeSearchViewModel.kt | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/ti/mobpo/ui/viewmodels/PokeSearchViewModel.kt b/app/src/main/java/com/ti/mobpo/ui/viewmodels/PokeSearchViewModel.kt index 4d12068..148d586 100644 --- a/app/src/main/java/com/ti/mobpo/ui/viewmodels/PokeSearchViewModel.kt +++ b/app/src/main/java/com/ti/mobpo/ui/viewmodels/PokeSearchViewModel.kt @@ -39,10 +39,11 @@ class PokeSearchViewModel(private val favouritesRepository: FavouritesRepository fun search(query: String) { viewModelScope.launch { try { - val filteredList = _initialPokemonList.value?.filter { it.name.startsWith(query, ignoreCase = true) } + val filteredList = _initialPokemonList.value?.binarySearch(query) val detailsList = mutableListOf() if (filteredList != null) { - for (pokemonSpecies in filteredList.take(SHOW_LIMIT)) { + for (index in filteredList until minOf(_initialPokemonList.value?.size ?: 0, filteredList + SHOW_LIMIT)) { + val pokemonSpecies = _initialPokemonList.value!![index] val details = service.getPokemonDetails(extractPokemonId(pokemonSpecies.url)) val isFavorite = favouritesRepository.isFavourite(details.id) detailsList.add(details.copy(isFavorite = isFavorite)) @@ -55,6 +56,21 @@ class PokeSearchViewModel(private val favouritesRepository: FavouritesRepository } } + private fun List.binarySearch(query: String): Int { + var low = 0 + var high = this.size - 1 + while (low <= high) { + val mid = (low + high) ushr 1 + val comparison = this[mid].name.compareTo(query, ignoreCase = true) + when { + comparison == 0 -> return mid + comparison < 0 -> low = mid + 1 + else -> high = mid - 1 + } + } + return low + } + private fun extractPokemonId(url: String): Int { val parts = url.split("/") return parts[parts.size - 2].toInt()