diegoRodicio

Está documentación está a túa disposición sin ningún custo económico. Sen embargo, para a súa elaboración dedico moito tempo e recursos, polo que agradecería unha colaboración co que consideres oportuno. Gracias.

View Categories

📚 Coleccions

📋 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 #