我正在制作一个地铁餐厅的复制品,在那里你会收到按特定顺序的订单,并检查顺序是否有效,以及菜单上是否有配料。
正确的顺序是:1个面包,0到1个肉,1个奶酪,1到3个额外的,1到3个酱汁。
这意味着一份订单至少可以有4种配料(面包、奶酪、1种额外配料、1种调味汁),最多可以有9种配料(面包、肉、奶酪、3种额外配料、3种调味汁)。
我的问题是,是否有比我更优化/更智能的方法来验证每种成分?
代码:
// Example order
HashMap<String, HashSet<String>> menu = new HashMap<>();
public static void main(String[] args) {
// Example order
List<String> ingredients = Arrays.asList("Wheat", "Veal",
"Yellow", "Cucumbers", "Onions");
if (!isValid(ingredients)) {
// throw exc;
}
boolean isValid(List<String> ingredients) {
if (ingredients.size() < 4 || ingredients.size() > 9) {
return false;
}
int i = 0;
// Bread
if (!Restaurant.menu.get("Bread")
.contains(ingredients.get(i++))) {
System.out.println("Bread");
return false;
}
// Meat
if (!(Restaurant.menu.get("Meat")
.contains(ingredients.get(i)))
&& !Restaurant.menu.get("Cheese")
.contains(ingredients.get(i))) {
System.out.println("Meat");
return false;
}
if (Restaurant.menu.get("Meat")
.contains(ingredients.get(i))) { // Meat case
if ((!Restaurant.menu.get("Cheese")
.contains(ingredients.get(++i)))) {
System.out.println("Cheese");
return false;
}
}
for (int j = ++i; j < ingredients.size(); j++) {
if ((!Restaurant.menu.get("Extras")
.contains(ingredients.get(j)))) { // Extras
if (j == i) {
return false;
} else {
if ((!Restaurant.menu.get("Sauces")
.contains(ingredients.get(j)))) { // Sauces
return false;
}
}
}
}
return true;
}
注1:我知道“如果有效,就不要碰它”这条规则,但我觉得这段代码已经进入了意大利面代码的领域,有一堆ifs基本上是在很多情况下检查类似的东西,如果我现在想不出更优化的方法,我只想听听第二个意见。
注2:我选择HashSet而不是ArrayList作为菜单,因为它搜索速度更快。
我看到你提出的解决方案的问题是,它试图一次解决所有问题,而不是单独解决它们。在我看来,这使得您的代码很难阅读和理解。虽然这可能有效,但您添加的业务规则越多,这将变得越困难。
那么你能做些什么呢?把这些担忧分开。
第一个问题是对成分进行分类:它是面包、奶酪、肉、额外的、调味汁吗?例如,您可以使用方法getClass()
创建一个类Menu
(而不是仅使用HashSet
用于菜单)返回类别,返回值可以是Enum。
第二个问题是顺序。您可以使用自定义比较器
检查列表的顺序。有关详细信息,请参阅此问题。
第三个关注点是某个类别的成分数量。鉴于你可以找出一种成分的类别,你可以数一数你有多少,并检查它是否正确。
关于如何实现这些目标,还有很多事情要说,我只是想为大家指出一个可能的方向。
如何检查两个数组(循环)是否具有相同顺序的相同元素。例如,让我们以数组[1,2,3,4]为例。 对于[2,3,4,1]、[3,4,1,2]、[4,1,2,3],测试应返回true,但对于[1,3,2,4]、[1,4,2,3]或[1,2,3,5]则不返回true。 我最初的方法是找到第一个匹配项——每个数组中一个相等的元素——并将这两个元素视为各自数组的初始元素,我逐个比较了数组的其余元素。 有没有
我正在尝试用流来解决这个问题,我查了一下,如果有人遇到过这个,但找不到这个。因此,我有一个包含三个元素的列表,我们称之为list1,另一个列表是list2,它可以包含不同的元素,也可以包含与list1重复的项。 我想达到的目标:- null 对于2-我可以使用set,将list2转换为set,然后看看list1是否包含了所有的set。 但我想知道我是否可以在这里使用stream! 例如 清单1(1
问题内容: 有没有办法断言某个元素(例如输入或链接)具有键盘焦点?我在Selenium中使用Codeception。在http://codeception.com/docs/modules/WebDriver上找不到任何内容 问题答案: 一个可靠的消息来源告诉我这可行: 测试愉快!
问题内容: 我想检查Selenium中是否存在一个元素,如果存在,请将其分配给一个名称。 现在,我有这样的东西: 但是,当不存在值为9的元素时,它将返回错误。有没有一种方法可以检查它是否存在,或者类似的东西? 问题答案: 有几种选择。我推荐这些。 1.创建方法或Web驱动程序扩展。 2.计算元素,如果有1个或更多元素,则获取它。 那你可以检查
我试图获取数组的每个元素并检查它是否是回文。如果给定数组中的所有元素都是回文,那么它应该返回1,如果不是,那么它应该返回0。 例如输入5 111 222 333 444 555预期输出1我的输出0 谢谢你的帮助。
问题内容: 使用普通的JavaScript(不是jQuery),是否可以检查元素是否 包含 类? 目前,我正在这样做: 问题是,如果我将HTML更改为此… …不再存在完全匹配的内容,因此我得到的默认输出为none()。但我还是想输出为,因为还 包含 了类。 问题答案: 使用方法: 这适用于所有当前浏览器,并且也有polyfill支持旧版本的浏览器。 或者 ,如果您使用较旧的浏览器,并且不想使用po