In Kotlin sono disponibili varie strutture dati ereditate da Java, ma il primo approccio
a questa tematica non può che passare dagli array. Anche in questo linguaggio gli array permettono di raccogliere una
sequenza di oggetti di tipo omogeneo, rendendoli accessibili mediante posizione.
Il primo approccio con tali costrutti lo abbiamo avuto sin dall'inizio di questa guida, quando abbiamo creato una funzione
main:
fun main(args:Array<String>)
In quel caso si aveva a che fare con un array di stringhe da usare per sfruttare eventuali parametri
passati all'avvio da riga di comando.
Un array può essere inizializzato con metodi già disponibili come arrayOf, genericamente, o più specificatamente
con intArrayOf, byteArrayOf, floatArrayOf e così via per tutti i più comuni tipi di dato. L'array sarà in ogni caso inizializzato
con gli argomenti passati in input:
// creiamo un array di stringhe di quattro posizioni
val elenco=arrayOf("cane", "topo", "gatto", "mucca")
// creiamo un array di numeri interi
val numeri= intArrayOf(3,4,5,6,7)
Gli array in Kotlin sono estremamente evoluti rispetto alla semplicità che tali costrutti
presentano in molti altri linguaggi. Vediamoli in dettaglio prendendo in esame l'oggetto numeri dichiarato nello snippet
precedente.
Possiamo manipolare gli array con la tipica notazione delle parentesi quadre per leggere valori
in base all'indice o assegnarne uno nuovo:
// accediamo al valore nella posizione 3 (contata a partire da 0)
// restituisce 6
valore=numeri[3]
// assegniamo un nuovo valore nella posizione 3
numeri[3]=14
Potremmo eseguire le medesime operazioni, rispettivamente, con i metodi get e
set. Per iterare sui singoli elementi si può optare per un classico costrutto for:
// stampiamo ogni singolo elemento
for (x in numeri)
println(x)
o in maniera ancora più sintetica possiamo rivolgerci al metodo forEach:
// stampiamo ogni singolo elemento
numeri.forEach { println(it) }
Il riferimento it rappresenta un iteratore che ad ogni esecuzione del blocco di codice
punta un elemento diverso dell'array.
Altre opzioni interessanti sono date da metodi che permettono di accedere al primo o all'ultimo valore o
alla sequenza di indici:
// restituisce il primo valore dell'array (3 in questo caso)
primo = numeri.first()
// restituisce l'ultimo valore dell'array ossia 7
ultimo = numeri.last()
// la sequenza di indici disponibili
indici = numeri.indices
// ultimo indice dell'array (vale a dire 4 in quanto abbiamo 5 elementi)
ultimoIndice = numeri.lastIndex
Altri metodi e proprietà permettono di ottenere informazioni sulla composizione dell'array. Infatti con
la proprietà size ne otterremo la lunghezza mentre con i metodi all,
any, filter e contains sapremo rispettivamente se tutti gli elementi rispettano un certo
predicato, se l'array è vuoto, quali sono gli elementi che rispecchiano una data condizione e se un
determinato elemento è presente all'interno:
// lunghezza dell'array (anche con il metodo count)
lunghezza = numeri.size
lunghezza = numeri.count()
// restituisce true se tutti gli elementi sono maggiori di zero
tuttiMaggioriZero = numeri.all(it>0)
// restituisce true se nell'array è presente almeno un elemento
almenoUno = numeri.any()
// restituisce gli elementi che rispettano il predicato
quelliMaggioriDiCinque = numeri.filter( it>5)
// restituisce true se un dato valore è presente nell'array
valorePresente = numeri.contains(8)
Inoltre, a seconda del tipo di array, vengono offerti ulteriori metodi specifici. Ad esempio,
l'array che stiamo considerando è fatto da valori interi pertanto si potranno usare metodi in grado
di restituire somme e medie di tutti quelli presenti:
// calcola la somma di tutti gli elementi. Risultato: 25
sommaTotale = numeri.sum()
// media dei valori. Risultato: 5
media = numeri.average()