📋 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 eadd()
dará un erro.
🧠 Visión xeral da creación de listas #
Forma | Descrición | Exemplo |
---|---|---|
[] | Lista dinámica baleira | var nomes = []; |
[valor1, valor2] | Lista inicializada con elementos | var cores = ['vermello', 'verde']; |
List.filled(tamaño, valor) | Lista de tamaño fixo | var notas = List.filled(3, 0); |
List.filled(..., growable:true) | Lista dinámica con valores por defecto | var nomes = List.filled(2, 'X', growable: true); |
<Tipo>[] | Lista baleira tipada | List<int> numeros = []; |
🧰 Funcións das listas #
Función / Propiedade | Descrición | Exemplo |
---|---|---|
add(valor) | Engade un elemento ao final da lista | lista.add('Ana'); |
addAll([...]) | Engade varios elementos | lista.addAll(['Brais', 'Uxía']); |
removeAt(i) | Elimina o elemento na posición i | lista.removeAt(0); |
clear() | Elimina todos os elementos da lista | lista.clear(); |
indexOf(val) | Devolve o índice do elemento val , ou -1 se non existe | lista.indexOf('Ana'); |
contains(val) | Comproba se a lista contén o valor val | lista.contains('Brais'); |
sort() | Ordena a lista alfabeticamente ou numéricamente | lista.sort(); |
every(cond) | Comproba se todos os elementos cumpren unha condición | lista.every((e) => e.length > 2); |
where(cond) | Filtra os elementos que cumpren a condición | lista.where((e) => e.startsWith('A')); |
map(func) | Aplica unha transformación a cada elemento | lista.map((e) => e.toUpperCase()); |
isEmpty | Devolve true se a lista está baleira | lista.isEmpty |
isNotEmpty | Devolve true se a lista contén elementos | lista.isNotEmpty |
forEach(func) | Executa unha función por cada elemento | lista.forEach((e) => print(e)); |
length | Cantidade de elementos na lista | print(lista.length); |
[] | Acceso a un elemento polo seu índice | print(lista[1]); |
[] = | Modifica o valor nun índice determinado | lista[0] = 'Novo valor'; |
🧪 Exemplos prácticos #
🔡 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 unMap
, non unSet
.
🧰 Funcións dos conxuntos #
Función / Propiedade | Descrición | Exemplo |
---|---|---|
add(valor) | Engade un elemento ao conxunto (só se non está presente) | conxunto.add('Ana'); |
addAll([...]) | Engade varios elementos | conxunto.addAll(['Ana', 'Brais']); |
remove(valor) | Elimina un elemento específico | conxunto.remove('Ana'); |
contains(valor) | Comproba se un elemento está no conxunto | conxunto.contains('Uxía'); |
clear() | Elimina todos os elementos | conxunto.clear(); |
length | Número de elementos no conxunto | print(conxunto.length); |
isEmpty | true se o conxunto está baleiro | if (conxunto.isEmpty) print('Está baleiro'); |
isNotEmpty | true se o conxunto contén elementos | if (conxunto.isNotEmpty) print('Hai elementos'); |
forEach(func) | Executa unha acción por cada elemento | conxunto.forEach((e) => print(e)); |
union(outroSet) | Devolve a unión de dous conxuntos | a.union(b); |
intersection(outroSet) | Elementos comúns a ambos conxuntos | a.intersection(b); |
difference(outroSet) | Elementos do primeiro conxunto que non están no segundo | a.difference(b); |
lookup(valor) | Devolve o elemento igual a valor , se existe | conxunto.lookup('Ana'); |
🧪 Exemplos prácticos #
🗺️ 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 claveV
é 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 / Propiedade | Descrición | Exemplo |
---|---|---|
[] | Obter o valor asociado a unha clave | print(mapa['cidade']); |
[] = | Engadir ou modificar unha entrada no mapa | mapa['cidade'] = 'Ourense'; |
addAll({...}) | Engadir varias entradas á vez | mapa.addAll({'país': 'España', 'moeda': 'Euro'}); |
remove(clave) | Eliminar unha clave e o seu valor asociado | mapa.remove('cidade'); |
clear() | Eliminar todos os pares clave-valor | mapa.clear(); |
containsKey(clave) | Comprobar se unha clave está presente no mapa | mapa.containsKey('cidade'); |
containsValue(val) | Comprobar se un valor está presente | mapa.containsValue('Ourense'); |
isEmpty | Devolve true se o mapa está baleiro | if (mapa.isEmpty) print('Mapa baleiro'); |
isNotEmpty | Devolve true se o mapa contén elementos | if (mapa.isNotEmpty) print('Hai datos'); |
length | Número total de pares clave-valor | print(mapa.length); |
keys | Devolve un iterable coas claves | print(mapa.keys); |
values | Devolve un iterable cos valores | print(mapa.values); |
forEach(func) | Executa unha función por cada par clave-valor | mapa.forEach((clave, valor) => print('$clave: $valor')); |
putIfAbsent() | Engade unha entrada só se a clave non existe | mapa.putIfAbsent('idioma', () => 'Galego'); |
update() | Actualiza o valor dunha clave existente | mapa.update('cidade', (v) => 'Lugo'); |
map() | Transforma o mapa, devolvendo un novo con outras claves e valores | var novo = mapa.map((k, v) => MapEntry(k, v.length)); |
🧪 Exemplos prácticos #
🧩 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
candob
énull
lanza unha excepción. Por iso, se existe risco denull
, 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
conSet
ouMap
e anidar varios bucles ou condicións.