首页 > 解决方案 > 如果语句不适用于数组中的所有对象

问题描述

我对 Java 编程很陌生,遇到了一个我认为有一个非常简单的解决方案的问题。但是我觉得我现在有隧道视野,似乎无法弄清楚问题到底是什么。所以我正在制作一个应该模拟鞋库的程序,其中一个可能的操作应该是添加新鞋 - 这部分工作得很好。有一个问题 - 在能够添加新鞋之前,应输入鞋的产品 ID,如果输入的产品 ID 与现有鞋的产品 ID 相同,则应通知用户并且无法添加具有相同产品 ID 的鞋子。我正在使用一个 if 和 if-else 语句(嵌套在一个 for 循环中,如果你这么说的话)应该通过一个包含 Shoe 类对象的数组来运行,但似乎 if 语句仅针对数组中的第一个对象运行,它按预期工作并通知用户具有相同产品 ID 的鞋已经存在,但是如果您输入第二个或第三个的产品 ID数组中的对象,程序将允许它通过而不会“阻止”用户添加它,尽管数组中已经存在具有该产品 ID 的鞋子。所以我的问题是这里出了什么问题——是我的代码格式、错字还是类似的东西?

具体情况的代码:

    System.out.println("Check to see if the product already exists "
        + "through entering product ID ");
    shoeExists = scanObj.next();
    
    //shoeArr is the array for Shoe object
    for (Shoe shoe:shoeArr) { 
        if (shoe != null && (shoe.getProdukt().equalsIgnoreCase(shoeExists))) {
            System.out.println("A shoe with product ID "+shoeExists+" already exists");
            System.out.println(" ");
            break;  
        }
                
        else if (shoe != null && !shoe.getProdukt().equalsIgnoreCase(shoeExists)){
            produktID = shoeExists;
            System.out.println("Product-ID saved. Enter other details below \n");
            System.out.println(" ");
            System.out.println("Product-ID: "+produktID);   
            System.out.println("Brand: ");
            brand = scanObj.next();
            System.out.println("Name: ");
            name = scanObj.next();
            System.out.println("Model: ");
            model = scanObj.next();
            System.out.println("Shoe type: ");
            shoeT = scanObj.next();
            System.out.println("Shoe size: ");
            shoeSize = scanObj.nextInt();
            System.out.println("Price: ");
            price = scanObj.nextInt();
            System.out.println("Stock: ");
            stock = scanObj.nextInt();
            
            Shoe b_obj = new Sko(produktID, brand, name, model,
                    shoeT, shoeSize, price, stock);
        
            if (counter < 20) {
                shoeArr[counter] = b_obj;
                counter++;
                
                System.out.println("Shoe with product ID "+produktID+ " added");
                
                break;
            }
            else {
                counter = skoArr.length-1;
                System.out.println("There is no room to add shoe.");
                
            }
        }
    }
        
    break;

我可能在某些地方没有使用正确的术语和语言,对此仍然很陌生并且每天都在学习......所以正如我上面提到的,这个解决方案适用于我数组中的第一个对象(预先添加到数组),但不适用于预先添加到数组中的其他两个对象,也不适用于通过这种情况添加的对象。此外,我确信这不是以任何方式解决此类问题的理想或最有效的方法,但这是我通过老师的学习材料和讲座得出的解决方案,并且最接近工作。

如果需要更多信息来查看导致问题的原因,或者如果某些事情解释得不好(我敢肯定是这种情况,哈哈),请告诉我,我会尽力改进。我怀疑这是一些非常基本的东西,但出了问题。

谢谢!

标签: javaarraysif-statement

解决方案


你的 else 语句在循环内。这使得每次找到具有不同 ID 的产品时都会运行它。

你应该考虑创建一个单独的 contains() 方法来检查 id 是否已经存在,如果它返回 false 你可以注册新产品。boolean found = false或者,您可以在循环之前创建一个变量for (Shoe shoe:shoeArr),并将其更改为true在数组中找到 id 时。然后,您可以将第二个 if(您的 else if)移出数组,将其条件更改为 !found,并拥有一个工作程序。

    boolean found=false;    

    for (Shoe shoe:shoeArr) { 
        if (shoe != null && (shoe.getProdukt().equalsIgnoreCase(shoeExists))) {
            System.out.println("A shoe with product ID "+shoeExists+" already exists");
            System.out.println(" ");
            break;  
        }
                
    }
    if (!found){
            produktID = shoeExists;
            System.out.println("Product-ID saved. Enter other details below \n");

推荐阅读