diegoRodicio

View Categories

📚 Coleccions

Tempo de lectura estimado: 7 minutos

📋 Listas

Unha lista é unha colección ordenada de elementos. Están representadas pola clase List.

Pódese obter a lonxitude dunha lista coa propiedade .length, e acceder aos seus elementos mediante o operador [].

var numeros = [1, 2, 3];

numeros[1] = 1;

var lista = ['Coche', 'Barco', 'Avión'];

📌 IMPORTANTE:

  • Aínda que Dart pode inferir o tipo automaticamente, é boa práctica indicalo explicitamente usando o operador <Tipo>, por exemplo <String> ou <int>.
  • Os índices das listas comezan en 0.

✅ Exemplos de creación de listas en Dart

🧪 Lista de números con valores xa definidos:

var numeros = [1, 2, 3];
numeros[1] = 1; // cambia o valor na posición 1
print(numeros); // [1, 1, 3]

🧪 Lista de cadeas con valores iniciais:

var lista = ['Coche', 'Barco', 'Avión'];
print(lista[0]); // 'Coche'

🧪 Lista baleira de números (crecemento dinámico):

var numeros = <int>[];
numeros.add(5);
numeros.add(10);
print(numeros); // [5, 10]

🧪 Lista baleira de cadeas:

var palabras = <String>[];
palabras.add('Luz');
palabras.add('Sombra');
print(palabras); // [Luz, Sombra]

🧱 Crear listas cun valor inicial: List.filled()

O constructor List.filled() permíteche crear unha lista cun número fixo de elementos, todos co mesmo valor inicial.

📌 Sintaxe:

List.filled(int length, E fill, {bool growable = false})

  • length: número de elementos que terá a lista.
  • fill: valor que se repetirá en cada posición.
  • growable: indica se a lista pode medrar ou non (por defecto false, o que crea unha lista de tamaño fixo).

Así, por exemplo:

var lista = List.filled(5, 'ok');
print(lista); // [ok, ok, ok, ok, ok]

var ceros = List.filled(4, 0);
print(ceros); // [0, 0, 0, 0]

Para crear listas que poden medrar dinámicamente cando se engaden elementos úsase o parámetro growable: true.

var nomes = List.filled(2, 'descoñecido', growable: true);
nomes.add('María');
print(nomes); // [descoñecido, descoñecido, María]

/*
1. `List.filled(2, 'descoñecido', growable: true)` crea unha lista de **tamaño inicial 2**, onde todos os elementos son `'descoñecido'`.
2. O parámetro `growable: true` fai que a lista non sexa de tamaño fixo, é dicir, permite engadir máis elementos máis tarde.
3. `nomes.add('María')` engade un terceiro elemento ao final da lista.
*/

📝 Nota:

  • Se non poñes growable: true, a lista será de tamaño fixo e add() dará un erro.

🧠 Visión xeral da creación de listas

FormaDescriciónExemplo
[]Lista dinámica baleiravar nomes = [];
[valor1, valor2]Lista inicializada con elementosvar cores = ['vermello', 'verde'];
List.filled(tamaño, valor)Lista de tamaño fixovar notas = List.filled(3, 0);
List.filled(..., growable:true)Lista dinámica con valores por defectovar nomes = List.filled(2, 'X', growable: true);
<Tipo>[]Lista baleira tipadaList<int> numeros = [];

🧰 Funcións das listas

Función / PropiedadeDescriciónExemplo
add(valor)Engade un elemento ao final da listalista.add('Ana');
addAll([...])Engade varios elementoslista.addAll(['Brais', 'Uxía']);
removeAt(i)Elimina o elemento na posición ilista.removeAt(0);
clear()Elimina todos os elementos da listalista.clear();
indexOf(val)Devolve o índice do elemento val, ou -1 se non existelista.indexOf('Ana');
contains(val)Comproba se a lista contén o valor vallista.contains('Brais');
sort()Ordena a lista alfabeticamente ou numéricamentelista.sort();
every(cond)Comproba se todos os elementos cumpren unha condiciónlista.every((e) => e.length > 2);
where(cond)Filtra os elementos que cumpren a condiciónlista.where((e) => e.startsWith('A'));
map(func)Aplica unha transformación a cada elementolista.map((e) => e.toUpperCase());
isEmptyDevolve true se a lista está baleiralista.isEmpty
isNotEmptyDevolve true se a lista contén elementoslista.isNotEmpty
forEach(func)Executa unha función por cada elementolista.forEach((e) => print(e));
lengthCantidade de elementos na listaprint(lista.length);
[]Acceso a un elemento polo seu índiceprint(lista[1]);
[] =Modifica o valor nun índice determinadolista[0] = 'Novo valor';

🧪 Exemplos prácticos

🔗 Ver o código en DartPad

🔡 Ordenación de listas: sort()

A función sort() permite ordenar os elementos dunha lista modificando a lista orixinal.

Por defecto, sort() require unha función de comparación que indique como comparar dous elementos. Esta función determina a orde de dous elementos e debe devolver:

  • Un número negativo se o primeiro elemento vai antes.
  • 0 se son iguais (en orde).
  • Un número positivo se o primeiro elemento vai despois.

📌 Sintaxe xeral:

lista.sort((a, b) => ...);

✅ Exemplo: orde alfabética

var palabras = ['laranxa', 'mazá', 'banana'];

palabras.sort((a, b) => a.compareTo(b));
// Resultado: [banana, laranxa, mazá]

  • compareTo() devolve:
  • un valor negativo se a < b
  • 0 se son iguais
  • un valor positivo se a > b

✅ Exemplo: orde alfabética inversa

palabras.sort((a, b) => b.compareTo(a));
// Resultado: [mazá, laranxa, banana]

✅ Exemplo: orde por lonxitude da palabra

var palabras = ['uva', 'laranxa', 'kiwi', 'figo'];

palabras.sort((a, b) => a.length.compareTo(b.length));
// Resultado: [uva, kiwi, figo, laranxa]

✅ Exemplo: orde numérica descendente

var numeros = [3, 1, 10, 7];

numeros.sort((a, b) => b.compareTo(a));
// Resultado: [10, 7, 3, 1]

✅ Exemplo: orde personalizada con condicións

Ordenar primeiro palabras curtas, logo longas; se teñen a mesma lonxitude, ordénanse alfabéticamente:

var palabras = ['luz', 'améndoa', 'sol', 'árbore'];

palabras.sort((a, b) {
  if (a.length != b.length) {
    return a.length.compareTo(b.length); // primeiro pola lonxitude
  } else {
    return a.compareTo(b); // logo alfabéticamente
  }
});
// Resultado: [luz, sol, árbore, améndoa]

💡 Se usas Dart 3 ou superior, podes usar funcións tipo flecha para comparacións sinxelas e tamén empregar sort con obxectos.

📌 A ter en conta…

  • A ordenación é sensible a maiúsculas/minúsculas. Para que non sexa sensible:
froitas.sort((a, b) => a.toLowerCase().compareTo(b.toLowerCase()));

  • sort() funciona tamén con números:
var numeros = [42, 7, 13];
numeros.sort();
print(numeros); // [7, 13, 42]

🔘 Conxuntos (Sets)

Un conxunto é unha colección non ordenada de elementos únicos. En Dart, úsase a clase Set.

var haloxenos = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};

🔹 Crear un conxunto baleiro

Para crear un conxunto baleiro, debes indicar o tipo explicitamente. Se non o fas, Dart interpretará {} como un mapa.

var nomes = <String>{};           // ✅ Crea un Set de cadeas
Set<String> nomes2 = {};          // ✅ Tamén válido
var nomes3 = {};                  // ⚠️ Crea un Map, NON un Set

📌 Lembra: {} sen tipo explícito crea un Map, non un Set.

🧰 Funcións dos conxuntos

Función / PropiedadeDescriciónExemplo
add(valor)Engade un elemento ao conxunto (só se non está presente)conxunto.add('Ana');
addAll([...])Engade varios elementosconxunto.addAll(['Ana', 'Brais']);
remove(valor)Elimina un elemento específicoconxunto.remove('Ana');
contains(valor)Comproba se un elemento está no conxuntoconxunto.contains('Uxía');
clear()Elimina todos os elementosconxunto.clear();
lengthNúmero de elementos no conxuntoprint(conxunto.length);
isEmptytrue se o conxunto está baleiroif (conxunto.isEmpty) print('Está baleiro');
isNotEmptytrue se o conxunto contén elementosif (conxunto.isNotEmpty) print('Hai elementos');
forEach(func)Executa unha acción por cada elementoconxunto.forEach((e) => print(e));
union(outroSet)Devolve a unión de dous conxuntosa.union(b);
intersection(outroSet)Elementos comúns a ambos conxuntosa.intersection(b);
difference(outroSet)Elementos do primeiro conxunto que non están no segundoa.difference(b);
lookup(valor)Devolve o elemento igual a valor, se existeconxunto.lookup('Ana');

🧪 Exemplos prácticos

🔗 Ver o código en DartPad

🗺️ Mapas

Un mapa é unha colección de pares clave-valor, onde cada clave se asocia a un valor único.
En Dart represéntanse mediante a clase Map<K, V>, onde:

  • K é o tipo da clave
  • V é o tipo do valor

Así, por exemplo:

var traducións = {
  'casa': 'house',
  'árbore': 'tree',
  'luz': 'light',
};

print(traducións['casa']); // house

var díasSemana = {
  1: 'luns',
  2: 'martes',
  3: 'mércores',
};
print(díasSemana[2]); // martes

🧠 Notas:

  • A clave debe ser única. Se engades unha clave que xa existe, o valor anterior será sobrescrito.
  • Os valores poden repetirse, as claves non.

✅ Crear mapas baleiros usando construtor

var animais = Map<String, String>();
animais['gato'] = 'cat';
animais['can'] = 'dog';

print(animais); // {gato: cat, can: dog}

var temperaturas = Map<int, double>();
temperaturas[2020] = 15.2;
temperaturas[2021] = 14.8;

🧰 Funcións dos mapas

Función / PropiedadeDescriciónExemplo
[]Obter o valor asociado a unha claveprint(mapa['cidade']);
[] =Engadir ou modificar unha entrada no mapamapa['cidade'] = 'Ourense';
addAll({...})Engadir varias entradas á vezmapa.addAll({'país': 'España', 'moeda': 'Euro'});
remove(clave)Eliminar unha clave e o seu valor asociadomapa.remove('cidade');
clear()Eliminar todos os pares clave-valormapa.clear();
containsKey(clave)Comprobar se unha clave está presente no mapamapa.containsKey('cidade');
containsValue(val)Comprobar se un valor está presentemapa.containsValue('Ourense');
isEmptyDevolve true se o mapa está baleiroif (mapa.isEmpty) print('Mapa baleiro');
isNotEmptyDevolve true se o mapa contén elementosif (mapa.isNotEmpty) print('Hai datos');
lengthNúmero total de pares clave-valorprint(mapa.length);
keysDevolve un iterable coas clavesprint(mapa.keys);
valuesDevolve un iterable cos valoresprint(mapa.values);
forEach(func)Executa unha función por cada par clave-valormapa.forEach((clave, valor) => print('$clave: $valor'));
putIfAbsent()Engade unha entrada só se a clave non existemapa.putIfAbsent('idioma', () => 'Galego');
update()Actualiza o valor dunha clave existentemapa.update('cidade', (v) => 'Lugo');
map()Transforma o mapa, devolvendo un novo con outras claves e valoresvar novo = mapa.map((k, v) => MapEntry(k, v.length));

🧪 Exemplos prácticos

🔗 Ver o código en DartPad

🧩 Elementos en coleccións

Un literal de colección pode conter:

  • Elementos simples: valores directos.
  • Elementos de fluxo de control: if, for, ...?, etc.

🔹 Operador de expansión (...) e de expansión opcional (...?)

O operador de expansión permite desempaquetar ou expandir os elementos doutra colección dentro dunha lista, set ou mapa literal.

  • ...colección insire todos os elementos da colección
  • ...?colección faino só se a colección non é null

✅ (...)

var a = [1, 2];
var lista = [0, ...a, 3];
// Resultado: [0, 1, 2, 3]
// Os elementos de 'a' expandíronse dentro da nova lista

✅ (...?)

Se a colección pode ser null, usa ...? para evitar un erro en tempo de execución:

List<int>? b = null;

var lista2 = [0, ...?b, 3];
// Resultado: [0, 3]
// Como 'b' é null, non se engade nada no seu lugar

⚠️ Usar ...b cando b é null lanza unha excepción. Por iso, se existe risco de null, usa ...?.

🔹 Elemento if en coleccións

Dart permite usar condicións if directamente dentro de listas, sets ou mapas para engadir elementos só se se cumpre unha condición.

if

Permite incluír elementos na colección só se unha condición é verdadeira.

var mostrar = true;

var items = [0, if (mostrar) 1, 2];
// Resultado: [0, 1, 2]
// Se 'mostrar' fose false → [0, 2]

🔹 Elemento for en coleccións

Dart permite usar bucles for directamente dentro de listas, sets ou mapas para xerar coleccións dinámicamente a partir doutras.

for en listas

Permite iterar sobre outra colección e engadir elementos calculados:

var numeros = [2, 3, 4];
var lista = [1, for (var n in numeros) n * n];
// Resultado: [1, 4, 9, 16]
// Engade o 1 e logo os cadrados de 2, 3 e 4

for combinado con if

Podes filtrar elementos durante a iteración:

var nums = [1, 2, 3, 4, 5, 6];
var pares = [for (var n in nums) if (n.isEven) n];
// Resultado: [2, 4, 6]
// Só se engaden os números pares da lista

💡 Tamén podes usar for con Set ou Map e anidar varios bucles ou condicións.

Exemplos de coleccións

🔗 Ver o código en DartPad

📚 Máis información