Array

TODO importat de List, pendent de revisar

Introducció

Un array és la manera més simple d’agrupar un nombre arbitrari de valors en els teus programes.

Un Array representa més d’un valor.

Concretament, un array és una seqüència de valors que tenen tots el mateix tipus de dada:

IntIntIntIntIntInt

Un array conté múltiples valors anomenats elements, o, de vegades, ítems.

71600339414

Els elements d’un array estan ordenats i s’hi accedeix amb un índex.

71600339414
012345

Què és un índex? Un índex és un nombre enter que correspon a un element de l’array. Un índex indica la distància d’un ítem respecte de l’element inicial d’un array. Això s’anomena indexació des de zero. El primer element de l’array és a l’índex 0, el segon element és a l’índex 1, perquè és a un lloc del primer element, i així successivament.

A la memòria del dispositiu, els elements de l’array s’emmagatzemen l’un al costat de l’altre.

Això té dues implicacions importants:

  • Accedir a un element d’un array pel seu índex és ràpid. Pots accedir a qualsevol element aleatori d’un array pel seu índex i esperar que trigui aproximadament el mateix temps que accedir a qualsevol altre element aleatori. Per això es diu que els arrays tenen accés aleatori.

  • Un array té una mida fixa. Això vol dir que no pots afegir elements a un array més enllà d’aquesta mida. Intentar accedir a l’element de l’índex 100 en un array de 100 elements llançarà una excepció perquè l’índex més alt és 99 (recorda que el primer índex és 0, no 1). Pots, però, modificar els valors als índexs de l’array.

Per declarar un array en codi, utilitzes la funció arrayOf():

val plants = arrayOf<String>("Carrot", "Daikon", "Onion", "Garlic", "Beet")

La funció arrayOf() pren els elements de l’array com a paràmetres i retorna un array del tipus que coincideix amb els paràmetres passats.

Això pot semblar una mica diferent d’altres funcions que has vist perquè arrayOf() té un nombre variable de paràmetres:

  • Si passes dos arguments a arrayOf(), l’array resultant conté dos elements, amb índexs 0 i 1.
  • Si passes tres arguments, l’array resultant tindrà 3 elements, amb índexs de l’1 al 2.

Com que Kotlin fa servir inferència de tipus, pots ometre el nom del tipus quan crides arrayOf():

val plants = arrayOf("Carrot", "Daikon", "Onion", "Garlic", "Beet")

Pots fer algunes coses interessants amb els arrays.

Per exemple, igual que amb els tipus numèrics Int o Double, pots sumar dos arrays fent servir l’operador més (+).

val plants = arrayOf("Carrot", "Daikon", "Onion", "Garlic", "Beet")
val animals = arrayOf("Cat", "Dog", "Cow", "Chicken", "Zoo")

val life = plants + animals

El resultat és un nou array que conté tots els elements de l’array plants i els elements de l’array animals.

Accedeix a un element d’un array

Pots accedir a un element d’un array pel seu índex:

val plants = arrayOf("Carrot", "Daikon", "Onion", "Garlic", "Beet")

require(plants[1] == "Daikon")
require(plants[3] == "Garlic")

Això s’anomena sintaxi de subíndex. Consta de tres parts:

  • El nom de l’array.
  • Un claudàtor d’obertura ([) i un de tancament (]).
  • L’índex de l’element de l’array dins dels claudàtors.

També pots establir el valor d’un element d’un array pel seu índex.

val plants = arrayOf("Carrot", "Daikon", "Onion", "Garlic", "Beet")

require(plants[1] == "Daikon")
plants[1] == "Banana"

require(plants[1] == "Banana")

Abans hem comentat que no pots canviar la mida d’un array.

Què passaria si ho intentessis?

val plants = arrayOf("Carrot", "Daikon", "Onion", "Garlic", "Beet")

plants[5] == "Banana"

Es llança una excepció ArrayIndexOutOfBounds perquè l’array només té 5 elements.

ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5

Si vols fer que un array sigui més gran del que és, has de crear un nou array.

fun main() {

    val plants = arrayOf("Carrot", "Daikon", "Onion", "Garlic", "Beet")
    require(plants.size == 5)

    // Has creat un objecte nou !
    val morePlants = plants + "Banana"
    require(morePlants.size == 6)

    plants[0] = "Apple"
    morePlants[0] = "Orange"

    require(plants[0] == "Apple")
    require(morePlants[0] == "Orange")
}

Tot i que els arrays són un dels aspectes fonamentals de la programació, fer-los servir per a tasques que requereixen afegir i eliminar elements, garantir la unicitat d’una col·lecció o mapar objectes a altres objectes no és especialment simple ni directe, i el codi de la teva app es podria convertir ràpidament en un embolic.

Per això, la majoria de llenguatges de programació implementen tipus de col·leccions especials per gestionar situacions que es donen habitualment en apps del món real.