Какие структуры данных ты используешь в Dart/Flutter?

Ответ

В Dart, как и в Flutter-разработке, я активно использую следующие структуры данных:

1. List (список/массив) — основная структура для упорядоченных коллекций:

List<int> scores = [95, 87, 92];
List<String> userNames = ['Alice', 'Bob'];
// Для фиксированного размера
List<int> fixedList = List.filled(5, 0, growable: false);

2. Map (словарь/ассоциативный массив) — для хранения пар ключ-значение:

Map<String, dynamic> user = {
  'id': 123,
  'name': 'John',
  'email': 'john@example.com'
};
Map<int, String> statusCodes = {200: 'OK', 404: 'Not Found'};

3. Set (множество) — для хранения уникальных элементов:

Set<String> uniqueTags = {'flutter', 'dart', 'mobile'};
Set<int> lotteryNumbers = {12, 45, 23, 12}; // {12, 45, 23}

4. Queue (очередь) из dart:collection — когда нужна FIFO/LIFO логика:

import 'dart:collection';

final queue = Queue<String>();
queue.add('first');
queue.add('second');
final firstOut = queue.removeFirst(); // 'first'

5. Собственные классы (модели данных) — для типизации бизнес-логики:

class Product {
  final String id;
  final String name;
  final double price;
  final List<String> categories;

  Product({
    required this.id,
    required this.name,
    required this.price,
    this.categories = const [],
  });
}

Выбор структуры зависит от операций:

  • Частый поиск по ключуMap (O(1) в среднем случае)
  • Сохранение порядка и индексацияList (доступ по индексу O(1))
  • Гарантия уникальностиSet (проверка содержит ли O(1))
  • Частые вставки/удаления в начале/концеQueue

Для более сложных сценариев использую пакет collection, который предоставляет HeapPriorityQueue, LinkedList и другие специализированные коллекции.

Ответ 18+ 🔞

А, ну это же про структуры данных в Dart! Давай разберём, как нормальные люди с этим работают, а не как в учебниках пишут.

1. List (просто список, массив) — это как твой холодильник, куда всё подряд кидаешь, а потом ищешь:

List<int> scores = [95, 87, 92];
List<String> userNames = ['Alice', 'Bob'];
// Если надо фиксированный размер — типа, чтоб не разъехался
List<int> fixedList = List.filled(5, 0, growable: false);

По сути, это твоя рабочая лошадка. Хранишь что угодно, обращаешься по индексу — быстро, удобно. Но если начнёшь в середину что-то впихивать или выдёргивать — может тормозить, ёпта.

2. Map (словарь) — вот это уже хитрая жопа. Когда тебе нужно не по номеру искать, а по ключу. Типа, "дай мне пользователя с id=123", а не "дай пятого в списке":

Map<String, dynamic> user = {
  'id': 123,
  'name': 'John',
  'email': 'john@example.com'
};
Map<int, String> statusCodes = {200: 'OK', 404: 'Not Found'};

Штука мощная, поиск быстрый, но память жрёт. Если ключей овердохуища — подумай, надо ли оно.

3. Set (множество) — уникальность, блядь! Когда тебе важно, чтобы элементы не повторялись:

Set<String> uniqueTags = {'flutter', 'dart', 'mobile'};
Set<int> lotteryNumbers = {12, 45, 23, 12}; // {12, 45, 23} — второй 12 выкинет нахуй

Проверка "а есть ли уже такой?" — мгновенная. Удобно для тегов, IDшников, всякого такого.

4. Queue (очередь) из dart:collection — когда тебе нужна очередь, как в магазине: кто первый пришёл, тот первый ушёл (или наоборот):

import 'dart:collection';

final queue = Queue<String>();
queue.add('first');
queue.add('second');
final firstOut = queue.removeFirst(); // 'first' — его и выдернули

Если делаешь что-то с буферизацией, заданиями по порядку — твой выбор.

5. Собственные классы (модели) — а вот это уже серьёзно. Когда надоело с этими Map<String, dynamic> работать и гадать, что там внутри:

class Product {
  final String id;
  final String name;
  final double price;
  final List<String> categories;

  Product({
    required this.id,
    required this.name,
    required this.price,
    this.categories = const [],
  });
}

Типизация, автодополнение в IDE, меньше ошибок в рантайме. Просто не надо быть распиздяем и писать всё в кучу.

А теперь главное — когда что использовать:

  • Ищешь по ключу частоMap. Быстро, как хуй с горы.
  • Важен порядок и обращение по индексуList. Взял по номеру — и всё.
  • Надо чтобы всё было уникальноеSet. Самый строгий вышибала.
  • Часто что-то добавляешь/убираешь в начале/концеQueue. Оптимизировано для этого.

Если совсем припёрло и стандартного не хватает — есть пакет collection. Там и приоритетные очереди, и связные списки, и прочая муть для особых случаев. Но для 95% задач хватает List, Map и Set — не усложняй, ядрёна вошь!