DMarlon Studio

Lección 11 · 11 de 20

Conjuntos · Dart

Use los conjuntos (Set) de Dart para guardar valores sin repetir: quitar duplicados con toSet() y comparar gustos con intersection, union y difference.

Dart · Conjuntos en DMarlon Studio: el código del ejemplo y su salida en la terminal

Un conjunto (Set) guarda cada valor una sola vez, y se escribe entre llaves: {'dart', 'flutter', 'mobile'}. Añadir con add('dart') un valor que ya está no hace nada, por eso tags acaba con cuatro etiquetas y no con cinco.

`toSet()` convierte una lista en un conjunto y, de paso, quita los repetidos: seis visitas son solo tres ciudades distintas. Los conjuntos de Dart conservan el orden en que entró cada valor por primera vez.

`contains()` es la pregunta típica de un conjunto, y es muy rápida aunque tenga miles de elementos, porque no recorre los valores uno a uno como una lista.

Entre dos conjuntos hay operaciones de toda la vida: `intersection()` da lo que tienen en común (lo que gusta a Ana y a Ben), `union()` lo junta todo sin repetir y `difference()` da lo que solo está en el primero. `remove()` quita un valor.

Cuidado con las llaves vacías: {} es un mapa vacío (la próxima lección), no un conjunto. Para un conjunto vacío hay que dar el tipo, como en `<String>{}`.

Código · main.dart

void main() {  // A set keeps each value only once, between { }.  var tags = {'dart', 'flutter', 'mobile'};  tags.add('dart'); // already there: nothing changes  tags.add('desktop');  print('Tags: $tags (${tags.length})');  // toSet() removes the repeated values of a list.  var visits = ['Rome', 'Paris', 'Rome', 'Lisbon', 'Paris', 'Rome'];  var cities = visits.toSet();  print('${visits.length} visits, ${cities.length} cities: $cities');  // contains is very quick in a set, even a big one.  print('Been to Lisbon? ${cities.contains('Lisbon')}');  // Operations between two sets.  var ana = {'chess', 'tennis', 'piano', 'cooking'};  var ben = {'tennis', 'football', 'cooking'};  print('Both like: ${ana.intersection(ben)}');  print('Either likes: ${ana.union(ben)}');  print('Only Ana: ${ana.difference(ben)}');  // remove takes a value out.  ana.remove('piano');  print('Ana now: $ana');  // {} alone is an empty map: an empty set needs its type.  var empty = <String>{};  print('Empty set: $empty, is empty? ${empty.isEmpty}');}

Salida · dart run main.dart

Tags: {dart, flutter, mobile, desktop} (4)
6 visits, 3 cities: {Rome, Paris, Lisbon}
Been to Lisbon? true
Both like: {tennis, cooking}
Either likes: {chess, tennis, piano, cooking, football}
Only Ana: {chess, piano}
Ana now: {chess, tennis, cooking}
Empty set: {}, is empty? true

Para recordar

  • Un Set va entre { } y no repite valores.
  • lista.toSet() quita los duplicados.
  • contains() es muy rápido en un conjunto.
  • intersection, union y difference comparan conjuntos.
  • Un conjunto vacío se escribe <String>{}.

Ejercicio

Cree dos conjuntos con los alumnos apuntados a música y a dibujo, y escriba quién va a las dos, quién va solo a música y cuántos alumnos distintos hay en total.