当前位置: 首页 > 知识库问答 >
问题:

检查List中的元素是否有效且顺序正确

锺离逸春
2023-03-14

我正在制作一个地铁餐厅的复制品,在那里你会收到按特定顺序的订单,并检查顺序是否有效,以及菜单上是否有配料。

正确的顺序是: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作为菜单,因为它搜索速度更快。

共有1个答案

王鹏飞
2023-03-14

我看到你提出的解决方案的问题是,它试图一次解决所有问题,而不是单独解决它们。在我看来,这使得您的代码很难阅读和理解。虽然这可能有效,但您添加的业务规则越多,这将变得越困难。

那么你能做些什么呢?把这些担忧分开。

第一个问题是对成分进行分类:它是面包、奶酪、肉、额外的、调味汁吗?例如,您可以使用方法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