Структуры данных (списки, множ, словари) Flashcards
Как записываются списки в Дарт?
Нужно указывать тип данных.
List<int> numbers = [1, 2, 3, 4, 5];</int>
List<String> fruits = ['apple', 'banana'];</String>
Как добавить новый элемент в Список?
Как удалить элемент из Списка?
Как вставить элемент в Список в определенном месте?
названиеСписка.add(новый элемент)
void main() {
List<String> fruits = ['apple', 'banana'];
fruits.add('orange'); // Добавляем новый элемент
print(fruits); // Выводит: [apple, banana, orange]
}</String>
remove(): Удалить элемент из списка.
insert(index, element): Вставить элемент по указанному индексу.
Доступ к элементам
По индексу.
void main() {
List<String> fruits = ['apple', 'banana', 'orange'];
print(fruits[0]); // Выводит: apple
}</String>
Как изменять элементы в Списке?
Ты можешь изменять элементы в списке, обращаясь к ним по индексу:
void main() {
List<String> fruits = ['apple', 'banana', 'orange'];
fruits[1] = 'kiwi'; // Изменяем второй элемент
print(fruits); // Выводит: [apple, kiwi, orange]
}</String>
Расскажи о всех способах перебора / итерации по Списку.
- Цикл FOR.
Он полезен для явного контроля над индексами:
void main() {
List<String> fruits = ['apple', 'banana', 'orange'];</String>
for (int i = 0; i < fruits.length; i++) {
print(fruits[i]);
}
}
- Цикл for-in
упрощает синтаксис и особенно удобен для перебора коллекций:
void main() {
List<String> fruits = ['apple', 'banana', 'orange'];</String>
for (var fruit in fruits) {
print(fruit);
}
}
forEach() - проходит по каждому элементу списка и выполняет действие для каждого элемента:
fruits.forEach((fruit) {
print(fruit);
});
map() - обычно используется для преобразования данных, его также можно использовать для перебора элементов:
void main() {
List<String> fruits = ['apple', 'banana', 'orange'];</String>
fruits.map((fruit) => print(fruit)).toList();
}
Метод map() применяет функцию к каждому элементу и возвращает новый список. В этом случае он выводит каждый элемент.
Выбор подходящего способа зависит от задачи и структуры кода.
В чём разница между for-in, и forEach()?
- Синтаксис и простота использования
for-in:
Синтаксически проще и напоминает стандартные циклы.
—————————
- Возможность прерывания цикла:for-in:
Ты можешь легко прервать выполнение цикла с помощью break или пропустить итерацию с помощью continue.
for (var fruit in fruits) {
if (fruit == ‘banana’) break; // Прерывание цикла
print(fruit);
}
В forEach() нет встроенной возможности для использования break или continue.
- Итерация по коллекциям с null:for-in:
При использовании for-in Dart выдаст ошибку, если коллекция null, поскольку он не может итерировать по null.forEach():
forEach() нельзя вызывать на null. Если ты попытаешься это сделать, произойдет ошибка времени выполнения.
Чтобы избежать ошибки при использовании forEach() с потенциально пустыми коллекциями, нужно проверять наличие элементов:
fruits?.forEach((fruit) {
print(fruit);
});
- Использование анонимных функций:
for-in:
Не поддерживает использование анонимных функций или лямбда-выражений непосредственно внутри цикла.
forEach():
Очень хорошо подходит для использования с анонимными функциями и лямбдами, что позволяет писать более декларативный и функциональный код.
Итог:
Используй for-in, если тебе нужно простое решение для перебора коллекций и возможность использовать break или continue. Используй forEach(), если тебе нужен функциональный стиль программирования или ты работаешь с анонимными функциями и не планируешь прерывать цикл.
Что такое лямбда-выражения?
Это удобный способ написания коротких функций для одноразовых операций. Они просты в использовании и помогают сделать код компактным и понятным, особенно когда передаются как аргументы в другие функции.
Пример:
Обычная функция:
int add(int a, int b) {
return a + b;
}
Лямбда-выражение:
var add = (int a, int b) => a + b;
Расскажи про Множества и чем они отличаются от Списка?
Напиши пример Множества (синтаксис)
Множества — это коллекции уникальных значений.
В них не может быть повторяющихся элементов.
void main() {
Set<String> fruits = {'apple', 'banana', 'orange'};
fruits.add('kiwi'); // Добавление элемента
fruits.add('apple'); // Не добавит, так как 'apple' уже есть</String>
print(fruits); // Вывод: {banana, kiwi, orange, apple}
}
- Порядок элементов:
List: Сохраняет порядок добавления элементов. Вы можете получить доступ к элементам по индексу (например, list[0]).
Set: Не гарантирует порядок элементов. Элементы могут храниться в произвольном порядке.
- Доступ к элементам:List: Позволяет обращаться к элементам по индексу. Например, myList[2] вернет третий элемент списка.Set: Не поддерживает доступ по индексу. Для работы с элементами необходимо использовать итерацию или методы, такие как contains().
- Производительность:List: Поиск элемента в List требует линейного времени, поскольку необходимо пройти по всему списку.Set: Операции поиска (например, contains()) в Set выполняются быстрее, поскольку они реализованы как хэш-таблицы, что позволяет выполнять такие операции за среднее время O(1).
- Использование:List: Подходит для хранения упорядоченных коллекций, где важен порядок и может быть несколько одинаковых значений.Set: Идеален для хранения уникальных значений, когда порядок не важен, и вам нужно быстро проверять наличие элемента.
Что такое Словарь и чем отличается от Множеств и Списков?
Словари представляют собой коллекции пар “ключ-значение”. Ключи должны быть уникальными, а значения могут повторяться.
void main() {
Map<String, int> ages = {
‘Alice’: 30,
‘Bob’: 25,
‘Charlie’: 35,
};
print(ages[‘Alice’]); // Вывод: 30
ages[‘Bob’] = 26; // Обновление значения
print(ages); // Вывод: {Alice: 30, Bob: 26, Charlie: 35}
}
Когда использовать:
Множества: Если вам нужно хранить уникальные значения и вам не важно их расположение. Словари: Если вам нужно хранить данные в виде пар "ключ-значение", где вы хотите быстро получать доступ к значению по ключу.
Назови способы итерации по Спискам, Множеству и Словарю.
Список - for, for-in, forEach, while, map(), fold().
Множества - contains(), map(),
for-in, forEach
Однако, так как порядок в Set не гарантирован, эти способы могут вести себя несколько иначе.
Словарь - forEach, for-in, map(), entries, keys и values
forEach (перебор пар ключ-значение):
Map<String, int> ages = {‘Alice’: 30, ‘Bob’: 25};
ages.forEach((key, value) {
print(‘$key: $value’);
});
for-in (перебор ключей):
for (var key in ages.keys) {
print(‘$key: ${ages[key]}’);
}
map(): (для преобразования пар)
var ageDoubles = ages.map((key, value) => MapEntry(key, value * 2));
entries (перебор всех пар):
for (var entry in ages.entries) {
print(‘${entry.key}: ${entry.value}’);
}
keys и values:
keys:
for (var key in ages.keys) {
print(key);
}
values:
for (var value in ages.values) {
print(value);
}
Как создать список с фиксированной длиной и как его изменить?
Список с фиксированной длиной — это список, у которого невозможно изменять количество элементов после создания (в отличие от динамических списков, где можно добавлять или удалять элементы). Для создания списка с фиксированной длиной используют такой синтаксис:
List<int> numbers = List.filled(3, 0); // длина 3, заполнен значениями 0, т.е. [0, 0, 0]</int>
Метод List.filled() заполняет все элементы одинаковым значением. Если ты хочешь создать список с фиксированной длиной и с разными значениями, ты можешь использовать List.generate()
Как добавить новую пару “ключ-значение” в словарь?
Чтобы добавить новую пару “ключ-значение”, можно использовать простой синтаксис с квадратными скобками:
Map<String, int> ages = {
‘alice’: 20,
‘bob’: 30,
};
ages[‘charlie’] = 25; // Добавляем ‘charlie’ с возрастом 25
будет:
{‘alice’: 20, ‘bob’: 30, ‘charlie’: 25}
Что произойдёт, если в словарь добавить пару с уже существующим ключом?
Если ты добавишь пару с ключом, который уже есть в словаре, значение для этого ключа будет перезаписано новым значением.
ages[‘alice’] = 22; // Обновляем возраст ‘alice’
{‘alice’: 22, ‘bob’: 30, ‘charlie’: 25}
Что делает конструктор?
Конструктор получает значения аргументов и присваивает их соответствующим свойствам объекта:
Например,
this.name присваивает 'Кейт' свойству name. this.age присваивает 20 свойству age.
Таким образом, конструктор выполняет следующие функции:
Он позволяет инициализировать свойства объекта при его создании. Он принимает аргументы, которые используются для установки значений свойств. Он обеспечивает готовность объекта к использованию сразу после его создания.