【问题标题】:Need to iterate through two arrays of items for comparison without parallelism需要遍历两个项目数组进行比较,没有并行性
【发布时间】:2012-04-23 04:41:10
【问题描述】:

因此,对于我的 java 类,我必须编写一个程序来接受浇头,并为每个浇头在总价上增加 75 美分。由于这个错误,我还没有为空测试而烦恼。基本上我会:

list1 = Valid Toppings
list2 = User Toppings

用户浇头可以按任何顺序输入,因此将它们作为并行数组进行匹配没有任何意义。你可以在下面的代码sn-p中看到我使用的逻辑,但它是不合法的。当我尝试编译时,我的终端到处呕吐。我将如何实现下面的逻辑,或者更好的方式来完全实现我的逻辑?

  for(x = 0; toppings.length < 3; x++)
    {
      if(toppings[x].equals(for(xx = 0; validToppings[0].length < 3; xx++) {validToppings[xx]})
        {setSize(size); price += .75;}
        else
        {System.out.println("Error in Pizza class: Attempt to set invalid pizza topping" + x + "(" + toppings[x] + ")")};
    }

【问题讨论】:

    标签: java arrays iteration


    【解决方案1】:

    这里的问题是你试图使用一个 if 语句,它做一个布尔比较,一个 for 语句,它不能变成一个布尔值。

    改为这样:

    for(int x = 0; topping.length < 3; x++){
             for(int xx = 0; vaildToppings[0].length < 3; xx++){
                 if(toppings[x].equals(validToppings[xx]){
    //do stuff
         }
    }
    

    嵌套的 for 循环是你的朋友。

    topping.length

    【讨论】:

    • 还有一个问题,即 topping.length
    • @Colleen 甚至没听懂,很好。我会更新答案
    【解决方案2】:

    我不确定你想做什么。如果您尝试测试一个字符串数组是否在另一个字符串数组中(如集合论中的“子集”)。那为什么不使用ArrayList,像这样:(对不起,如果我的语法有点不对劲,我已经有一段时间没有做java了)

    ArrayList<String> toppings = new ArrayList<>();
    toppings.add("Pepperoni");
    toppings.add("Olives");
    
    ArrayList<String> validToppings = new ArrayList<>();
    validToppings.add("Pepperoni");
    validToppings.add("Salami");
    validToppings.add("Olives");
    validToppings.add("Cheese");
    
    boolean toppingsValid = validToppings.containsAll(toppings);
    

    【讨论】:

    • 这是一项家庭作业,因此 OP 很可能无法使用原始数组。接下来,尽管重点很清楚,但该语法还很遥远。
    • 哦,我没看到它是用来做作业的,我的错。 OP,如果您还没有学会使用(或明确告知不要使用)集合和集合论,请忽略此答案。也可以随意将语法编辑为像 @Makoto 这样的 java,我确实提到过我已经有一段时间没有使用 Java了
    【解决方案3】:

    你的代码被破坏的原因是你有 toppings.length

    for 循环中的所有内容都应基于您的计数器。

    【讨论】:

    • 循环计数器不必是i,所以那里没有错。虽然没有xxx 的类型声明,所以这个答案并不正确......
    • 抱歉,我以为是 i(已将其更新为 x),但您没有理解重点。此外,如果这是 java,您确实需要为 x 声明一个类型。
    • 我有 x 和 xx 的声明。 Pizza.java:88: 表达式的非法开头 if(toppings[x].equals(for(xx = 0; validToppings.length
    • 与其他答案一样,您必须声明变量类型,例如 for(int i=0... 而不仅仅是 for(i=0.....
    【解决方案4】:

    试试这个:

    for (int x = 0; x < toppings.length; x++)
    {
        if (!validToppings.contains(toppings[x]))
        {
            //throw some error, or print a message, etc....
        }
        else
        {
            //do stuff
        }
    }
    

    【讨论】:

    • 这不会遍历另一个数组。
    • 它做了 OP 需要它做的事情,但是(除非他们需要做一个嵌套循环)。你知道 .contains() 是做什么的吗?
    • .contains() 在内部做一个嵌套循环,它的功能就像一个嵌套的 for 循环,但看起来更好。
    • @Colleen:代码中没有任何内容表明他在代码中实现了List&lt;E&gt;,所以我看不出contains() 会如何应用。
    • 请记住,这似乎是一项功课,通常不允许使用 .contains() 之类的方法。我记得在高中时(这无疑是来自),我们只允许使用原始数组。没有数组列表或任何东西!太烦人了。
    【解决方案5】:

    嵌套的 for 循环是正确的方法。不要忘记在循环本身(或其他地方,如果您想使用 C 风格)中声明循环计数器的类型,否则您将整天收到编译器错误。

    for(int x = 0; x < toppings.length; x++) {
        for(int xx = 0; xx < validToppings[0].length; xx++) {
            if(toppings[x].equals(validToppings[xx]) {
                // Perform operations here.
        }
    }
    

    附带说明:toppings.length &lt; 3 在整个循环中可能为真,也可能不为真;它永远不可能是真的,从而导致循环不执行,或者它可能是真的,导致无限循环,不管xxx。小心这种情况。

    【讨论】:

    • 您再次没有解决 toppings.length
    猜你喜欢
    • 1970-01-01
    • 2020-03-08
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 2016-10-25
    • 2017-01-27
    相关资源
    最近更新 更多