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

«Какие структуры данных ты используешь в Dart/Flutter?» — вопрос из категории Алгоритмы и структуры данных, который задают на 29% собеседований 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 и другие специализированные коллекции.