如果尚未将对象添加到阵列中,如何将其添加到

时间:2019-02-05 19:37:21

标签: java arrays

我已经检查了所有地方,并在Java中找不到与我的问题类似的答案。我使用的是数组,而不是数组列表。

每次在我的CoffeeShop上下新订单时,都必须将CoffeeShop添加到客户访问过的一系列商店中,但是即使他们访问过两次说“星巴克”,也只能出现一次。

我有一个主文件,一个CoffeeShop类和一个Customer类,这三个文件在OOP中都可以协同工作。

我觉得我的问题源于我是如何从CoffeeShop类中向我的客户类发送CoffeeShop对象的(如果发送“ this”是适当的,也就是AKA),或者是我如何将CoffeeShop添加到其中的数组中“ addStore()”方法(如果索引“ i”正在执行我认为正在执行的操作,则也可以)。

这是我的代码,将CoffeeShop对象添加到商店的客户列表中,主要看起来是这样的:

secondCup.newOrder(bruno, latte); //bruno is a Customer object, latte is a Drink object.

在我的CoffeeShop类中,新的订单实例方法如下:

public void newOrder(Customer c, Drink d)
{
    /* 
    double t = markUp*d.calculateCost();
    DrinkOrder o = new DrinkOrder(c, d, t);
    orders[pendingOrders++] = o;

    currentProfit += t - d.calculateCost();

    tracker[trackerSize++] = c;
    totalOrders++;
    */ //above is irrelevant 

    c.addStore(this); //Here is where im adding the store that called the 'newOrder()' method
}

我认为“这”应该是名为“ .newOrder()”的特定咖啡店,但主要是在其他商店调用newOrder()时,说:

starBucks.newOrder(bruno, latte);

当我打印拜访的商店阵列时,我得到2秒杯,而不是第二个杯子和一个星巴克(我认为这是因为我是如何将CoffeeShop发送到addStore()或将商店追加到所访问的商店的阵列)。

这是我的方法,应检查存储是否已存在于数组中,如果不存在,则应将其添加到数组中:

    public void addStore(CoffeeShop shop)
{
    size++;

    for (int i=0; i<size; i++)
    {
        if (visited[i] == null) //if the first position is null (which it will be, add their first shop visited
        {
            visited[i] = shop;
            break;
        }

        else if (visited[i].equals(shop)) //if if the index of the array equals the shop passed, then break the loop AKA dont add it to the array
        {
            break;
        }

        else //if none of the positions equal the shop, add it to the array
        {
            visited[i] = shop;
        }
    }
}

我尝试使用do while,如下所示,但是我得到的输出与上面的尝试完全相同:

for (int i=0; i<size; i++)
{
    do
    {
        visited[i] = shop; //complete atleast one action, because the customer hasnt visited anystore yet so the first store should always be added
    }
    while (!visited[i].equals(shop)); //add to the array as long as they're not equal

这是我的输出:

Total coffee orders: 6

Swift, Taylor has visited:
Starbucks
Starbucks
Starbucks

Mars, Bruno has visited:
Second Cup
Second Cup

Ada, Lovelace has visited:
Second Cup

这应该是这样(泰勒两次访问过星巴克,但只能添加一次):

Total coffee orders: 6

Swift, Taylor has visited:
Starbucks
Second Cup

Mars, Bruno has visited:
Starbucks
Second Cup

Ada, Lovelace has visited:
Second Cup

以防万一,这是我的打印方法:

public void displayStoresVisited()
{
    for (int i=0; i<size; i++)
        System.out.println(visited[i].getName());
}

getName()仅返回我访问过的CoffeeShop数组的索引“ i”处的CoffeeShop的名称

非常感谢您的帮助!这是明天到期! <3

编辑: 我在addStore()方法中更改了“ else”,这要归功于下面的一个可爱的答案,它给了我空指针异常,因为它不知道如何处理她去过的taylors 3rd store(又名星巴克两次),所以我很乐意如果车间相等,则将for循环迭代大小减去1(如下所示)。我认为这不是执行此操作的最佳方法,因此,如果有人从这里开始提供任何技巧来处理此类情况!

非常感谢!

    for (int i=0; i<size; i++)
    {
        if (visited[i] == null)
        {
            visited[i] = shop;
            break;
        }

        else if (visited[i].equals(shop))
        {
            size -= 1;
        }

        else
        {
            continue;
        }
    }

这是我将代码更改为有人感兴趣时建议的错误:

Total coffee orders: 6

Swift, Taylor has visited:
Starbucks
Second Cup
Exception in thread "main" java.lang.NullPointerException
        at Customer.displayStoresVisited(Customer.java:105)
        at TestPhase4.main(TestPhase4.java:82)

2 个答案:

答案 0 :(得分:0)

addStore下方的位置是错误的,因为您没有添加到阵列中,而是将现有商店替换为新商店(然后在以后添加)

else //if none of the positions equal the shop, add it to the array
    {
        visited[i] = shop;
    }

替换
else {
    continue;
}

使用下一个visited检查i,甚至最好将其删除,因为它是最后一个

仅当在阵列中添加新店铺时,才增加size变量

if (visited[i] == null) //if the first position is null (which it will be, add their first shop visited
    {
        visited[i] = shop;
        size++;
        break;
    }

答案 1 :(得分:0)

int i=0;
while((i<size) && (!visited[i].equals(shop))){
  ++i;
}
if(i>=visited.length){
   //increase the size of your array here.
}
if(i >= size){
   visited[i] = shop;  
   size++;
}


/* get rid of this:
for (int i=0; i<size; i++)
{
    if (visited[i] == null)
    {
        visited[i] = shop;
        break;
    }

    else if (visited[i].equals(shop))
    {
        size -= 1;
    }

    else
    {
        continue;
    }
}
*/