Set 是一种集合,用来存放元素,具有以下特点:
可以用 Set() 构造函数创建,任何迭代器都可以作为形参。
julia> s1 = Set(1:4)
Set([4, 2, 3, 1])
用 push!() 添加新元素(和数组一样),用 delete!() 删除元素。
julia> push!(s1, 5)
Set([5, 4, 2, 3, 1])
# Duplicates are ignored
julia> push!(s1, 3)
Set([5, 4, 2, 3, 1])
julia> delete!(s1, 5)
Set([4, 2, 3, 1])
julia> length(s1) # length counts entries, despite the non-sequential type
4
和其他几种集合类型一样,可以用 in 或 ∈ 运算符检查某个条目是否在集合中(输入 \in 然后按 Tab 键即可打出该符号)。
julia> 3 ∈ s1
true
支持对两个集合进行以下运算(括号中给出了运算符符号的输入快捷方式)。
union(A, B) 或 A ∪ B(\cup):属于 A、属于 B,或同时属于两者的所有条目。intersect(A, B) 或 A ∩ B(\cap):A 和 B 共有的所有条目。setdiff(A, B)(无符号):属于 A 但不属于 B 的条目。symdiff(A, B)(无符号):属于 A 或属于 B,但不同时属于两者的条目。issubset(A, B) 或 A ⊆ B(\subseteq)或 B ⊇ A(\supseteq):如果 A 中的所有条目也都在 B 中,则为 true。issetequal(A, B)(无符号):如果 A 和 B 包含完全相同的条目,则为 true。isdisjoint(A, B)(无符号):如果 A 和 B 没有任何共同的条目(即交集为空),则为 true。julia> s1 = Set(1:4);
julia> s2 = Set(3:6);
julia> s1 ∪ s2 # union
Set([5, 4, 6, 2, 3, 1])
julia> s1 ∩ s2 # intersect
Set([4, 3])
julia> setdiff(s1, s2)
Set([2, 1])
julia> symdiff(s1, s2)
Set([5, 6, 2, 1])
julia> s1 ⊇ s2 # issubset
false
其中许多运算还有会修改原集合的版本,只需在函数名末尾加上 !。
完整的函数列表请参阅手册。
你和你的商业伙伴经营着一家小型餐饮公司。你们刚刚答应为当地一个烹饪俱乐部举办一场活动,活动特色是“俱乐部最爱”菜肴。这家俱乐部缺乏举办大型活动的经验,需要在组织、采购、备料和上菜方面得到帮助。你决定写一些小的 Julia 函数,来加快整个筹备流程。
活动用的食谱来自各种来源,其中的食材似乎出现了重复(甚至更多)的条目,你肯定不想最后买回来一堆多余的东西! 在开始采购和烹饪之前,每道菜的食材清单都需要先“清理”一下。
实现clean_ingredients(dish_name, dish_ingredients)函数,它接收菜肴的名称和一个Vector,里面装着食材。
该函数应返回一个Tuple,第一项是菜肴名称,后面是去重后的食材Set。
julia> clean_ingredients("Punjabi-Style Chole", ["onions", "tomatoes", "ginger paste", "garlic paste", "ginger paste", "vegetable oil", "bay leaves", "cloves", "cardamom", "cilantro", "peppercorns", "cumin powder", "chickpeas", "coriander powder", "red chili powder", "ground turmeric", "garam masala", "chickpeas", "ginger", "cilantro"])
("Punjabi-Style Chole", Set(["garam masala", "bay leaves", "ground turmeric", "ginger", "garlic paste", "peppercorns", "ginger paste", "red chili powder", "cardamom", "chickpeas", "cumin powder", "vegetable oil", "tomatoes", "coriander powder", "onions", "cilantro", "cloves"]))
活动将同时提供鸡尾酒和无酒精鸡尾酒,也就是_不含_酒精的混合饮品。 你需要确保无酒精鸡尾酒确实不含酒精,而鸡尾酒确实_含有_酒精。
实现check_drinks(drink_name, drink_ingredients)函数,它接收饮品的名称和一个Vector,里面装着食材。
如果饮品不含任何含酒精的食材,函数应返回饮品名称后接“Mocktail”;如果饮品含有酒精,则返回饮品名称后接“Cocktail”。
在本练习中,鸡尾酒只会包含ALCOHOLS常量中列出的酒类:
julia> check_drinks("Honeydew Cucumber", ["honeydew", "coconut water", "mint leaves", "lime juice", "salt", "english cucumber"])
"Honeydew Cucumber Mocktail"
julia> check_drinks("Shirley Tonic", ["cinnamon stick", "scotch", "whole cloves", "ginger", "pomegranate juice", "sugar", "club soda"])
"Shirley Tonic Cocktail"
宾客名单中有饮食需求各不相同的用餐者,你的员工需要把菜肴分成 Vegan、Vegetarian、Paleo、Keto 和 Omnivore 几类。
实现categorize_dish(dish_name, dish_ingredients)函数,它接收菜肴名称和该菜肴食材的set。
该函数应返回一个String,内容为dish name: CATEGORY(该菜肴属于哪个餐食类别)。
所有菜肴都会“归入”下列类别之一:VEGAN、VEGETARIAN、PALEO、KETO 或 OMNIVORE。
julia> categorize_dish("Sticky Lemon Tofu", Set(["tofu", "soy sauce", "salt", "black pepper", "cornstarch", "vegetable oil", "garlic", "ginger", "water", "vegetable stock", "lemon juice", "lemon zest", "sugar"]))
"Sticky Lemon Tofu: VEGAN"
julia> categorize_dish("Shrimp Bacon and Crispy Chickpea Tacos with Salsa de Guacamole", Set(["shrimp", "bacon", "avocado", "chickpeas", "fresh tortillas", "sea salt", "guajillo chile", "slivered almonds", "olive oil", "butter", "black pepper", "garlic", "onion"]))
"Shrimp Bacon and Crispy Chickpea Tacos with Salsa de Guacamole: OMNIVORE"
有些宾客有过敏和额外的饮食禁忌。 这些食材需要为每道菜标注出来,以免造成问题。
实现tag_special_ingredients(dish)函数,它接收一个Tuple,第一项是菜肴名称,第二项是该菜肴食材的Vector或Set。
返回菜肴名称,后面跟着需要在菜肴描述中特别注明的食材Set。
Vector中的菜肴食材可能有重复,也可能没有。
在本练习中,所有需要标注的过敏原或特殊食材都在SPECIAL_INGREDIENTS常量中。
julia> tag_special_ingredients(("Ginger Glazed Tofu Cutlets", ["tofu", "soy sauce", "ginger", "corn starch", "garlic", "brown sugar", "sesame seeds", "lemon juice"]))
("Ginger Glazed Tofu Cutlets", Set(["garlic","soy sauce","tofu"]))
julia> tag_special_ingredients(("Arugula and Roasted Pork Salad", ["pork tenderloin", "arugula", "pears", "blue cheese", "pine nuts", "balsamic vinegar", "onions", "black pepper"
]))
("Arugula and Roasted Pork Salad", Set(["pork tenderloin", "blue cheese", "pine nuts", "onions"]))
为了准备下单和采购,你需要为菜单上的所有内容汇总一份食材“总清单”(数量稍后填写)。
实现compile_ingredients(dishes)函数,它接收一个菜肴Vector,并返回所有列出菜肴中全部食材的集合。
每道单独的菜肴用它的食材Set表示。
julia> dishes = [Set(["tofu", "soy sauce", "ginger", "corn starch", "garlic", "brown sugar", "sesame seeds", "lemon juice"]), Set(["pork tenderloin", "arugula", "pears", "blue cheese", "pine nuts","balsamic vinegar", "onions", "black pepper"]), Set(["honeydew", "coconut water", "mint leaves", "lime juice", "salt", "english cucumber"])];
julia> compile_ingredients(dishes)
Set(["arugula", "brown sugar", "honeydew", "coconut water", "english cucumber", "balsamic vinegar", "mint leaves", "pears", "pork tenderloin", "ginger", "blue cheese", "soy sauce", "sesame seeds", "black pepper", "garlic", "lime juice", "corn starch", "pine nuts", "lemon juice", "onions", "salt", "tofu"])
主人给了你一份菜肴清单,希望把这些菜做成“一口大小”的开胃菜,用托盘端上。 你需要从作为较大份量准备的主菜肴清单中,把它们挑出来。
实现separate_appetizers(dishes, appetizers)函数,它接收一个菜肴名称的Vector和一个开胃菜名称的Vector。
该函数应返回一个Vector,其中的菜肴名称清单已移除开胃菜名称。
dishes或appetizers这两个Vector都可能包含重复项,需要去重。
julia> dishes = ["Avocado Deviled Eggs","Flank Steak with Chimichurri and Asparagus", "Kingfish Lettuce Cups", "Grilled Flank Steak with Caesar Salad","Vegetarian Khoresh Bademjan","Avocado Deviled Eggs", "Barley Risotto","Kingfish Lettuce Cups"];
julia> appetizers = ["Kingfish Lettuce Cups","Avocado Deviled Eggs","Satay Steak Skewers", "Dahi Puri with Black Chickpeas","Avocado Deviled Eggs","Asparagus Puffs", "Asparagus Puffs"];
julia> separate_appetizers(dishes, appetizers)
["Vegetarian Khoresh Bademjan", "Barley Risotto", "Flank Steak with Chimichurri and Asparagus", "Grilled Flank Steak with Caesar Salad"]
在每个类别(VEGAN、VEGETARIAN、PALEO、KETO或OMNIVORE)中,你都要挑出只在一道菜里出现的食材。
这些“单例”食材会指派给专门的采购员,确保在忙于处理其他事情时不会漏掉它们。
实现singleton_ingredients(dishes, intersection)函数,它接收一个菜肴Vector和同一类别的CATEGORY_INTERSECTION常量。
每道菜用它食材的Set表示。
每个CATEGORY_INTERSECTION是一个Set,其中的食材在该类别的多道菜里都出现过。
运用集合运算,你的函数应返回一个“单例”食材的Set(只在该类别的一道菜中出现的食材)。
julia> singleton_ingredients(example_dishes, EXAMPLE_INTERSECTION)
Set(["garlic powder", "sunflower oil", "mixed herbs", "cornstarch", "celeriac", "honey", "mushrooms", "bell pepper", "rosemary", "parsley", "lemon", "yeast", "vegetable oil", "vegetable stock", "silken tofu", "tofu", "cashews", "lemon zest", "smoked tofu", "spaghetti", "ginger", "breadcrumbs", "tomatoes", "barley malt", "red pepper flakes", "oregano", "red onion", "fresh basil"])