Метод фильтрации Kotlin

#android #dictionary #kotlin #filter

#Android #словарь #kotlin #Фильтр

Вопрос:

У меня есть список идентификаторов, скажем, размером 10, и у меня есть еще один список элементов, мне нужен эффективный способ удаления элементов, которые соответствуют любому из этих 10 идентификаторов

   val list=items.filter { id== 1||id==3... and so on but in a more efficient way } 
 

заранее спасибо

Ответ №1:

Возвращает список, содержащий все элементы исходной коллекции, за исключением элементов, содержащихся в данной коллекции элементов:

 fun main() {
    val ids = listOf(20, 30, 40, 50, 60)
    val removeIds = listOf(30, 60)
    val result = ids - removeIds
    println(result)   // [20, 40, 50]
}
 

Или с помощью substract:

 val result = ids subtract removeIds
 

Ответ №2:

В случае, если вы имеете дело с a MutableList , вы можете изменить его (или его копию), используя методы removeAll или retainAll :

Храните все предметы ids , которых нет в removeIds :

 fun main() {
    val ids = mutableListOf(20, 30, 40, 42, 50, 60)
    val removeIds = listOf(20, 30, 40, 50, 60)
    ids.retainAll { it !in removeIds }
    println(ids)
}
 

или удалить все элементы из ids тех, которые присутствуют в removeIds :

 fun main() {
    val ids = mutableListOf(20, 30, 40, 42, 50, 60)
    val removeIds = listOf(20, 30, 40, 50, 60)
    ids.removeAll { it in removeIds }
    println(ids)
}
 

Оба main s сводятся ids только [42] к этим примерам и выводят именно это.

К сожалению, это не будет работать с неизменяемыми List s, вам придется сделать это MutableList первым, предпочтительно с помощью toMutableList() или чего-либо подобного.

Ответ №3:

Вы можете использовать метод predicate и filterTo

 //list of things you don't want in your filtered list
 val listOfIds= listOf(312,264,309,297,233,262,149,156,214,350,316,315)
//a predicate used in filterTo function
  private val someFilteringCondition = { num: Int ->listOfIds.contains(num) }

//list that we will filter into (it will contains filtered list
private val filteredPublishers = mutableListOf<SegmentModel>()

 items.filterNotTo(filteredPublishers,someFilteringCondition )
                        adpater?.publishersChanged(it)
 

теперь список filteredPublishers содержит элементы, у которых нет упомянутых идентификаторов