Iterable.contains în Kotlin

contains (operatorul in) verifică dacă un element există; indexOf dă poziția primei apariții sau -1.

Sintaxă
operator fun <T> Iterable<T>.contains(element: T): Boolean    // x in colectie
fun <T> Iterable<T>.indexOf(element: T): Int

Ce face Iterable.contains

contains(x) întoarce true dacă elementul există în colecție. De obicei se scrie cu operatorul in: x in lista, iar negația cu !in. Compararea se face cu equals (adică ==), deci pentru texte contează literele mari și mici.

indexOf(x) întoarce poziția primei apariții, sau -1 dacă elementul lipsește. lastIndexOf(x) dă ultima apariție.

Pe o listă, căutarea verifică elementele unul câte unul. Dacă faci multe verificări pe o colecție mare, transformă-o în Set: acolo in este aproape instantaneu.

Parametri

Parametru Descriere
element Valoarea căutată.

Ce returnează

contains: Boolean. indexOf: poziția (Int) sau -1.

Exemple

Exemplul 1: in, !in și indexOf

Pentru „Brașov” poziția este -1, pentru că nu este în listă.

fun main() {
    val traseu = listOf("București", "Ploiești", "Sinaia", "Ploiești", "Buzău")
    println("Sinaia" in traseu)
    println("Brașov" !in traseu)
    println(traseu.contains("ploiești"))
    println("Prima dată prin Ploiești: poziția ${traseu.indexOf("Ploiești")}")
    println("Ultima dată: poziția ${traseu.lastIndexOf("Ploiești")}")
    println("Brașov: ${traseu.indexOf("Brașov")}")
}

Rezultat

true
true
false
Prima dată prin Ploiești: poziția 1
Ultima dată: poziția 3
Brașov: -1

Exemplul 2: Funcționează și pentru data class

Clasele data au equals generat, deci un obiect nou cu aceleași valori este găsit.

data class Loc(val rand: Int, val scaun: Int)

fun main() {
    val ocupate = listOf(Loc(1, 4), Loc(3, 7), Loc(5, 2))
    val cerute = listOf(Loc(3, 7), Loc(3, 8))
    for (loc in cerute) {
        println("$loc ${if (loc in ocupate) "ocupat" else "liber"}")
    }
}

Rezultat

Loc(rand=3, scaun=7) ocupat
Loc(rand=3, scaun=8) liber

Greșeli frecvente

  • Cauți un text fără să ții cont de literele mari: "ploiești" in traseu este false. Folosește traseu.any { it.equals(x, ignoreCase = true) }.
  • Cauți obiecte ale unei clase obișnuite (nu data): două obiecte cu aceleași câmpuri nu sunt egale, deci in dă false.

Comenzi înrudite

  • Iterable.any: any: măcar un element îndeplinește condiția; all: toate o îndeplinesc; none: niciunul nu o îndeplinește.
  • Iterable.find: Întoarce primul element care îndeplinește condiția sau null dacă nu există niciunul.
  • List.binarySearch: Caută rapid un element într-o listă sortată; întoarce poziția lui sau un număr negativ care arată unde ar trebui inserat.
  • setOf: Creează o mulțime: o colecție fără duplicate, în care verifici rapid dacă un element există.
  • Map.containsKey: Verifică dacă map-ul are o anumită cheie (containsKey, operatorul in) sau o anumită valoare (containsValue).