Ответ
В 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 — не усложняй, ядрёна вошь!