Map — встроенная структуру данных, используемая для хранения пар ключ-значение в Dart. В этой статье мы рассмотрим основы Map в Dart, чем они отличаются от других типов коллекций и некоторые распространенные варианты использования.
Что такое Map в Dart
Map — это набор пар ключ-значение. Это означает, что каждый элемент на Map состоит из двух частей: ключа и значения. Ключ используется для идентификации элемента, в то время как значение — это данные, связанные с этим элементом. При работе с картами вы можете добавлять, удалять элементы и получать доступ к ним на основе их ключей.
Создание Map
Чтобы создать Map в Dart, вы можете использовать встроенный конструктор Map или синтаксис map literal. Вот пример:
// Использование Map конструктора
var myMap = Map();
// Использование literal syntax
var myMap = {'key1': 'value1', 'key2': 'value2'};
В первом примере мы создаем пустую карту с помощью конструктора Map. Во втором примере мы используем синтаксис map literal для создания карты с двумя парами ключ-значение: ‘key1’: ‘value1’ и ‘key2’: ‘value2’.
Добавление и удаление элементов в Map
Чтобы добавить элемент на карту, вы можете использовать оператор []. Чтобы удалить элемент с карты, вы можете использовать метод remove(). Вот пример:
var myMap = {'key1': 'value1', 'key2': 'value2'};
myMap['key3'] = 'value3'; // Добавляем ключ-значение в Map
myMap.remove('key2'); // Удаляем ключ-значение в Map
В этом примере мы добавляем новую пару ключ-значение к карте с помощью оператора [] и удаляем пару ключ-значение с ключом ‘key2’ с помощью метода remove().
Доступ к элементам в Map
Чтобы получить доступ к элементу на карте, вы можете использовать оператор [] с ключом. Вот пример:
var myMap = {'key1': 'value1', 'key2': 'value2'};
print(myMap['key1']); // Получим: value1
В этом примере мы используем оператор [] для доступа к значению, связанному с ключом ‘key1’ на карте. Результатом выполнения инструкции print будет ‘value1’.
Перебор по Map
Чтобы выполнить итерацию по карте в Dart, вы можете использовать метод forEach(). Вот пример:
var myMap = {'key1': 'value1', 'key2': 'value2'};
myMap.forEach((key, value) {
print('$key: $value');
});
В этом примере мы используем метод forEach() для перебора пар ключ-значение в карте. Оператор print внутри метода forEach() выведет:
key1: value1
key2: value2
Преобразование Map в List
Иногда вам может понадобиться преобразовать Map в List в Dart. Вы можете сделать это, используя свойство entries, которое возвращает итерацию объектов MapEntry. Каждый объект MapEntry содержит пару ключ-значение из карты. Вот пример:
var myMap = {'key1': 'value1', 'key2': 'value2'};
var myList = myMap.entries.toList();
print(myList);
В этом примере мы используем свойство entries, чтобы получить итерацию объектов MapEntry, а затем с помощью метода ToList() преобразуем итерацию в список. Результатом выполнения инструкции print будет:
[{key: key1, value: value1}, {key: key2, value: value2}]
Фильтрация Map
Вы можете отфильтровать Map в Dart, используя метод where(), который возвращает новую карту, содержащую только пары ключ-значение, удовлетворяющие заданному условию. Вот пример:
var myMap = {'key1': 1, 'key2': 2, 'key3': 3, 'key4': 4};
var filteredMap = myMap.where((key, value) => value % 2 == 0);
print(filteredMap);
В этом примере мы используем метод where() для создания новой карты, содержащей только пары ключ-значение, где значение четное. Результатом выполнения инструкции печати будет:
{key2: 2, key4: 4}
Объединение Map
В Dart вы можете объединять Map с помощью оператора распространения …. Оператор spread позволяет вам развернуть содержимое карты или выполнить итерацию на другой карте.
Вот пример объединения двух карт:
Map<String, dynamic> map1 = {'a': 1, 'b': 2};
Map<String, dynamic> map2 = {'c': 3, 'd': 4};
Map<String, dynamic> mergedMap = {...map1, ...map2};
print(mergedMap); // Output: {a: 1, b: 2, c: 3, d: 4}
В приведенном выше примере мы сначала определяем две карты map1 и map2. Затем мы создаем новую карту mergedMap, используя оператор spread, чтобы развернуть содержимое map1 и map2 в новую карту.
Обратите внимание, что если есть ключи, которые существуют на обеих картах, будет использоваться значение ключа на последней карте. Например:
Map<String, dynamic> map1 = {'a': 1, 'b': 2};
Map<String, dynamic> map2 = {'b': 3, 'c': 4};
Map<String, dynamic> mergedMap = {...map1, ...map2};
print(mergedMap); // Output: {a: 1, b: 3, c: 4}
В этом примере значение ключа ‘b’ в map2 перезаписывает значение того же ключа в map1.
Когда используют Map
Map полезен в ситуациях, когда вам необходимо сохранить набор пар ключ-значение, таких как словарь или файл конфигурации. Они также могут использоваться для хранения связанных данных структурированным образом, где ключи выступают в качестве меток для значений.
Заключение
Map — полезная структура данных для хранения пар ключ-значение. Он предлагает несколько методов добавления, удаления элементов и доступа к ним на основе их ключей. Карты отличаются от списков и наборов тем, что они хранят пары ключ-значение и неупорядочены. При работе с картами важно учитывать эти различия, чтобы убедиться, что вы используете правильную структуру данных для своих нужд.