检查集合中是否包含元素
本课属于 Coddy Dart 学习旅程的“逻辑与流程控制”单元。第 20 课,共 65 课。
使用 Set 时,你经常需要检查集合中是否存在某个特定元素。contains() 方法提供了一种简单高效的检查方式:如果找到该元素,就返回 true;如果没有找到,就返回 false。
使用 contains() 配合 Set 的一个主要优势是性能出色。与搜索 List 时可能需要逐个检查元素不同,Set 操作针对快速查找进行了优化,因此即使集合很大,contains() 也非常高效。
Set<String> ingredients = {'flour', 'sugar', 'eggs', 'butter'};
// 检查是否有指定的食材
bool hasFlour = ingredients.contains('flour');
bool hasMilk = ingredients.contains('milk');
print(hasFlour); // true
print(hasMilk); // false当你需要验证数据、检查前置条件,或根据信息是否属于特定集合来筛选信息时,这个方法特别有用。布尔结果非常适合用于条件语句和逻辑运算。
挑战
简单创建一个程序,通过检查厨房储藏室中是否有特定食材,来管理食谱验证系统。你的程序应当:
- 读取一个表示食谱名称的字符串输入
- 读取多个表示储藏室中现有食材的字符串输入(收到
"pantry_done"时结束输入) - 读取多个表示食谱所需食材的字符串输入(收到
"recipe_done"时结束输入) - 使用现有的储藏室食材创建一个集合
- 使用
contains()方法检查储藏室中是否有每种所需食材 - 按照下方所示的准确格式打印食谱验证结果
例如,如果食谱名称是 "Chocolate Chip Cookies",储藏室中的食材是 "flour"、"sugar"、"eggs"、"butter"、"vanilla",所需食材是 "flour"、"sugar"、"chocolate chips"、"butter",你的程序应输出:
Recipe: Chocolate Chip Cookies
Pantry ingredients: {flour, sugar, eggs, butter, vanilla}
Required ingredients: [flour, sugar, chocolate chips, butter]
Checking ingredient availability:
- flour: Available
- sugar: Available
- chocolate chips: Missing
- butter: Available
Missing ingredients: [chocolate chips]
Status: Cannot make recipe - missing 1 ingredient(s)如果食谱名称是 "Scrambled Eggs",储藏室中的食材是 "eggs"、"butter"、"salt"、"pepper",所需食材是 "eggs"、"butter"、"salt",你的程序应输出:
Recipe: Scrambled Eggs
Pantry ingredients: {eggs, butter, salt, pepper}
Required ingredients: [eggs, butter, salt]
Checking ingredient availability:
- eggs: Available
- butter: Available
- salt: Available
Missing ingredients: []
Status: Ready to cook - all ingredients available如果食谱名称是 "Fruit Salad",储藏室中的食材是 "apples"、"bananas",所需食材是 "apples"、"oranges"、"grapes"、"honey",你的程序应输出:
Recipe: Fruit Salad
Pantry ingredients: {apples, bananas}
Required ingredients: [apples, oranges, grapes, honey]
Checking ingredient availability:
- apples: Available
- oranges: Missing
- grapes: Missing
- honey: Missing
Missing ingredients: [oranges, grapes, honey]
Status: Cannot make recipe - missing 3 ingredient(s)你的程序必须使用 contains() 方法,将每种所需食材与储藏室集合进行比对。将所需食材存储在列表中,以保持检查顺序,并将缺少的食材收集到另一个列表中。如果所有食材都齐全,状态应显示 "Ready to cook - all ingredients available"。如果缺少任何食材,状态应显示 "Cannot make recipe - missing X ingredient(s)",其中 X 是缺少食材的数量。
亲手试试
import 'dart:io';
void main() {
// 读取食谱名称
String? recipeName = stdin.readLineSync();
// 读取储藏室里的食材,直到读到 "pantry_done"
Set<String> pantryIngredients = <String>{};
String? pantryInput;
while ((pantryInput = stdin.readLineSync()) != "pantry_done") {
if (pantryInput != null) {
pantryIngredients.add(pantryInput);
}
}
// 读取所需食材,直到读到 "recipe_done"
List<String> requiredIngredients = <String>[];
String? recipeInput;
while ((recipeInput = stdin.readLineSync()) != "recipe_done") {
if (recipeInput != null) {
requiredIngredients.add(recipeInput);
}
}
// TODO:在下方编写你的代码
// 使用 pantryIngredients.contains() 检查每种所需食材
// 创建一个列表,存储缺少的食材
// 检查食材是否齐全,并按要求的格式打印结果
// 打印结果(替换为你的实现)
print("Recipe: $recipeName");
print("Pantry ingredients: $pantryIngredients");
print("Required ingredients: $requiredIngredients");
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程控制中的所有课
自己练习: Dart 在线编译器